gpt4 book ai didi

python - 使用 Django OAuth2 工具包生成单一访问 token

转载 作者:太空狗 更新时间:2023-10-29 17:42:43 25 4
gpt4 key购买 nike

我正在使用最新的 Django OAuth2 Toolkit (0.10.0)使用 Python 2.7、Django 1.8 和 Django REST 框架 3.3

在使用 grant_type=password 时,我注意到每当用户请求新的访问 token 时都会出现一些奇怪的行为:

curl -X POST -d "grant_type=password&username=<user_name>&password=<password>" -u"<client_id>:<client_secret>" http://localhost:8000/o/token/

访问 token 和刷新 token 已创建旧的访问和刷新 token 在 token 超时之前仍然可用!

我的问题:

  • 我需要的是每次用户请求新的访问 token 时,旧的将变得无效、无法使用并将被删除。
  • 另外,有没有办法让密码 grunt 类型不会创建刷新 token 。我在我的申请中没有任何用处。

我找到的一个解决方案是 REST Framework OAuth一次提供一个访问 token 的配置。我不急于使用该提供商,但我可能别无选择。

最佳答案

如果您想在发布新的访问 token 之前删除所有以前的访问 token ,有一个简单的解决方案可以解决此问题:制作您自己的 token View 提供程序!

下面的代码可能会帮助您实现这种功能:

from oauth2_provider.models import AccessToken, Application
from braces.views import CsrfExemptMixin
from oauth2_provider.views.mixins import OAuthLibMixin
from oauth2_provider.settings import oauth2_settings

class TokenView(APIView, CsrfExemptMixin, OAuthLibMixin):
permission_classes = (permissions.AllowAny,)

server_class = oauth2_settings.OAUTH2_SERVER_CLASS
validator_class = oauth2_settings.OAUTH2_VALIDATOR_CLASS
oauthlib_backend_class = oauth2_settings.OAUTH2_BACKEND_CLASS

def post(self, request):
username = request.POST.get('username')
try:
if username is None:
raise User.DoesNotExist
AccessToken.objects.filter(user=User.objects.get(username=username), application=Application.objects.get(name="Website")).delete()
except Exception as e:
return Response(e.message,status=400)

url, headers, body, status = self.create_token_response(request)
return Response(body, status=status, headers=headers)

您应该注意的部分是 Try-Except block 。在那里我们找到访问 token 并删除它们。在我们创建一个新的之前。

你可以看看如何创建你自己的Provider using OAuthLib .此外,这也可能有用:TokenView in django-oauth-toolkit .你可以在那里看到原始的 Apiview。如您所说,您正在使用这个包。

至于refresh_token,正如之前在其他答案中提到的那样,您不能按照您的要求去做。查看oauthlib password grunt 类型的代码时,您会看到在其初始化时,refresh_token 设置为True。除非您自行更改 Grunt 类型,否则无法完成。

但是您可以使用访问 token 执行我们上面所做的相同操作。创建 token ,然后删除刷新 token 。

关于python - 使用 Django OAuth2 工具包生成单一访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36383965/

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