django-ouath-toolkit with social-auth

时间:2017-10-23 23:23:03

标签: python django oauth django-authentication

我尝试设置social-authpython-social-auth)与django-oauth-toolkit的另一个Django项目进行对话。

我希望Django项目A使用来自Django项目B的OAuth2登录.Django项目A使用social-auth,项目B使用django-oauth-toolkit作为OAuth2提供者。

项目A可以成功登录其他OAuth2提供商,例如Google,但在尝试使用我的自定义后端登录时出现以下错误:

AuthStateMissing at /sso/complete/custom-backend/
Session value state missing.

这是在项目A中实现自定义后端的方式:

class CustomBackend(BaseOAuth2):
    name = 'custom-backend'
    EXTRA_DATA = [
        ('profile', 'org')
    ]

    def authorization_url(self):
        return "%s/oauth2/authorize" % self.setting("URL")

    def access_token_url(self):
        return "%s/oauth2/token" % self.setting("URL")

    def user_data(self, access_token, *args, **kwargs):
        resp = requests.get("%s/me/" % self.setting("URL"), headers={
            'Authorization': "Bearer %s" % access_token
        })
        if resp.status_code != 200:
            raise Exception("Error while getting user details from auth source.")
        data = resp.json()

        return {
            'username': data['email'],
            'first_name': data['first_name'],
            'last_name': data['last_name'],
            'user_id': data['id'],
            'email': data['email']
        }

有一个名为SOCIAL_AUTH_CUSTOM_BACKEND_URL的设置,它等于项目B的基本URL(http://localhost:8001用于测试)。

项目B重定向到项目A时(引发错误时)的URL为:http://localhost:8000/sso/complete/custom-backend/?redirect_state=6kg4S1eitCMqTTzFGrm9uerG37UNkUPl&code=e64by72AkD2unMVVsGZCz0V2byuUyu&state=6kg4S1eitCMqTTzFGrm9uerG37UNkUPl

我们将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

正如我发现的那样,HTTP cookie 被同一主机上的端口隔开。所以我在localhost:8000上运行了项目A(OAuth2客户端),在localhost:8001上运行了项目B(OAuth2服务器)。 Django的sessionid Cookie在身份验证过程中被覆盖,导致此错误。

解决方案是在另一台主机上运行OAuth2服务器(我刚刚在macOS上的/private/etc/hosts中创建了一个条目,如下所示:

127.0.0.1    id.localhost

并将SOCIAL_AUTH_CUSTOM_BACKEND_URL更新为http://id.localhost:8001