【问题标题】:Django-allauth, JWT, OauthDjango-allauth,智威汤逊,Oauth
【发布时间】:2015-04-03 23:58:31
【问题描述】:

我有一个 AngularJS 单页应用程序,它使用基于 Django Rest 框架的 Django 后端 API。 API 受django-rest-framework-jwt 保护。我想在服务器端使用django-allauth 进行帐户管理和身份验证。

我只是在流程中遗漏了一个部分:我的 Oauth-Token 如何从客户端转移到 JWT-token 中?基本上,我想根据python-social-auth 进行此处http://blog.wizer.fr/2013/11/angularjs-facebook-with-a-django-rest-api/ 的描述。

所以我的问题是,如何通过django-allauth 的链接实现ObtainAuthToken 类?

【问题讨论】:

  • 我不是这个话题的专家,但是为什么你需要基于另一个令牌创建一个令牌?如果您想创建 JWT 令牌,请查看此库:python-jose.readthedocs.org/en/latest/jwt/api.html
  • @shacki 您是否找到有关此问题的任何解决方案?我正是这个问题,并寻求一个好的解决方案

标签: django django-allauth jwt


【解决方案1】:

社交登录通常有两种登录流程:客户端(“Javascript SDK”)和服务器端。如果您的服务器需要获得授权,通过服务器端流程通常要容易得多。这也是我认为的 all-auth (你没有提到你使用像你提到的博客文章那样的前端库)。

现在的挑战是将令牌从服务器提供给前端。您可能会在 SPA 初始化的 HTML 中加载令牌,然后从 Angular 保存令牌客户端(cookie、localStorage 等),这样会话就不会在刷新时丢失。

如果您不希望用户离开您的应用,您可以在新窗口中打开您的 /accounts/login//accounts/signup/ 网址。在那个新窗口中,他们授权您的应用程序,并且您的服务器在返回时收到令牌。在那里,您必须 generate a JWT token manually,并将其呈现到模板中,以便 javascript 可以访问它。使用该弹出窗口中的 js,您可以与打开弹出窗口的应用程序进行通信,并将令牌传递给它 - 请参阅此 SO answer 示例 - 以便它可以保存它。

【讨论】:

    【解决方案2】:

    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.
    

    【讨论】:

      【解决方案3】:

      我们在我工作的公司使用 hello.js 进行 O-Auth。

      1. 您在 Python 端提供一个 shim,并在用户连接其社交帐户后获取刷新令牌和所需的任何其他数据。

      2. 我们通过 Django 将他们重定向到他们尝试从其 OAuth 提供者页面访问的页面。

      每个用户仍然有自己的 JWT 所需的电子邮件帐户,但您可以假设他们社交帐户范围内的任何电子邮件都是他们的电子邮件,然后使用 django 的功能来创建新用户:User.objects.create(email=emailStringFromOauthData) 等。

      【讨论】:

        猜你喜欢
        • 2021-07-15
        • 2016-09-21
        • 2017-01-30
        • 2020-12-27
        • 2015-05-25
        • 2023-03-10
        • 2015-10-16
        • 2018-07-14
        • 1970-01-01
        相关资源
        最近更新 更多