Django-allauth, JWT, Oauth

17
我有一个AngularJS单页面应用程序,它使用基于Django Rest Framework的Django后端API。API受到django-rest-framework-jwt的保护。我想在服务器端使用django-allauth进行帐户管理和身份验证。
但是,我还缺少一个重要步骤:客户端的Oauth-Token如何转换为JWT令牌?基本上,我想要像这里描述的那样,使用python-social-auth
所以我的问题是,如何使用django-allauth实现链接中的ObtainAuthToken类?

我不是这个主题的专家,但你为什么需要基于另一个token创建一个token呢?如果你想要创建一个JWT token,可以看看这个库:https://python-jose.readthedocs.org/en/latest/jwt/api.html - Cheng
@schacki,您是否找到了有关此问题的任何解决方案?我也正好遇到了这个问题,并正在寻求一个好的解决方案。 - Moe Far
3个回答

2
社交登录通常有两种登录流程:客户端(“Javascript SDK”)和服务器端。如果您的服务器需要授权,通常更容易通过服务器端流程进行。我认为这也是all-auth所做的(而您没有提到您是否使用类似于您提到的博客文章中使用的前端库)。
现在的挑战是将令牌从服务器提供给前端。您可能会在SPA初始化的HTML中加载令牌,然后从Angular客户端保存令牌(cookie,localStorage等),以便在刷新时不会丢失会话。
如果您不希望用户离开您的应用程序,则可以在新窗口中打开您的/accounts/login//accounts/signup/ URL。在该新窗口中,他们授权您的应用程序,并在返回时将令牌传递给您的服务器。在那里,您需要手动生成JWT令牌,并将其呈现到模板中,以便JavaScript可以访问它。使用弹出窗口中的js,您可以与打开弹出窗口的应用程序通信并传递令牌 - 可以参考此SO答案以获取示例,以便保存它。

1
我们在我工作的公司使用hello.js进行O-Auth。
1. 您需要在Python端提供一个shim,并在用户连接其社交账户后获取刷新令牌和其他所需数据。 2. 我们通过Django将他们重定向到他们尝试访问的页面,从他们的OAuth提供商的页面中。 3. 每个用户仍然拥有自己的电子邮件账户,这对于JWT是必需的,但您可以假设在其社交账户范围内的任何电子邮件都是他们的电子邮件,然后使用Django的功能创建新用户:User.objects.create(email=emailStringFromOauthData)等。

1
Django-allauth提供了信号,让您可以钩入社交登录过程。在您的情况下,我建议订阅allauth.socialaccount.signals.pre_social_login信号。代码将类似于这样:
from allauth.socialaccount.signals import pre_social_login

@receiver(pre_social_login)
def create_jwt_token(sender, request, sociallogin, **kwargs):
    # dig into the sociallogin object to find the new access token.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接