gpt4 book ai didi

python - Api key 和 Django Rest Framework 授权 token

转载 作者:太空狗 更新时间:2023-10-29 20:47:13 28 4
gpt4 key购买 nike

我已经在使用内置的 Django rest auth token ,我计划发布另一个 api,外部集成将调用该 api 以调用我的 Django 应用程序中的某些操作。问题是我想为此外部 api 调用生成另一个 token ,该 token 必须与身份验证系统分开(例如 Mandrill API key 或 Github 个人访问 token )。从 Django rest framework authtoken 模型生成 api key 是一个好的解决方案吗?

外部 API token :

  • 绝不能过期(它可能在 session 身份验证系统中过期)
  • 可以链接到用户但不是必需的(如果链接到帐户)
  • 可以撤销和重新激活

您有发布 api key 的经验吗?

是否有 Django Rest Framework 推荐的最佳实践?

谢谢;)

最佳答案

我已经创建了一个新的身份验证后端和一个新的 token 模型,以避免对内置 token 行为产生副作用。

模型.py

class ApiKeyToken(models.Model):
key = models.CharField(max_length=40, primary_key=True)
company = models.ForeignKey(Company)
is_active = models.BooleanField(default=True)

def save(self, *args, **kwargs):
if not self.key:
self.key = self.generate_key()
return super(ApiKeyToken, self).save(*args, **kwargs)

def generate_key(self):
return binascii.hexlify(os.urandom(20)).decode()

def __unicode__(self):
return self.key

身份验证.py

class ApiKeyAuthentication(TokenAuthentication):

def get_token_from_auth_header(self, auth):
auth = auth.split()
if not auth or auth[0].lower() != b'api-key':
return None

if len(auth) == 1:
raise AuthenticationFailed('Invalid token header. No credentials provided.')
elif len(auth) > 2:
raise AuthenticationFailed('Invalid token header. Token string should not contain spaces.')

try:
return auth[1].decode()
except UnicodeError:
raise AuthenticationFailed('Invalid token header. Token string should not contain invalid characters.')

def authenticate(self, request):
auth = get_authorization_header(request)
token = self.get_token_from_auth_header(auth)

if not token:
token = request.GET.get('api-key', request.POST.get('api-key', None))

if token:
return self.authenticate_credentials(token)

def authenticate_credentials(self, key):
try:
token = ApiKeyToken.objects.get(key=key)
except ApiKeyToken.DoesNotExist:
raise AuthenticationFailed('Invalid Api key.')

if not token.is_active:
raise AuthenticationFailed('Api key inactive or deleted.')

user = token.company.users.first() # what ever you want here
return (user, token)

然后您可以请求安全的 api:

curl http://example.com/api/your-awesome-api.json -H "Authorization: Api-Key {token}" 

关于python - Api key 和 Django Rest Framework 授权 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36135100/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com