带有社交身份验证的 django-oauth-toolkit
django-ouath-toolkit with social-auth
我正在尝试设置 social-auth
(python-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
不胜感激,谢谢。
我发现,HTTP cookie 不是 由同一主机上的端口分隔。所以我在 localhost:8000
上有项目 A(OAuth2 客户端)运行ning,在 localhost:8001
上有项目 B(OAuth2 服务器)运行ning。 Django 的 sessionid
Cookie 在身份验证过程中被覆盖,导致此错误。
解决方案是 运行 不同主机上的 OAuth2 服务器(我刚刚在 macOS 上的 /private/etc/hosts
中做了一个条目,看起来像:
127.0.0.1 id.localhost
并将 SOCIAL_AUTH_CUSTOM_BACKEND_URL
更新为 http://id.localhost:8001
。
我正在尝试设置 social-auth
(python-social-auth
) 以使用 django-oauth-toolkit
.
我希望 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
不胜感激,谢谢。
我发现,HTTP cookie 不是 由同一主机上的端口分隔。所以我在 localhost:8000
上有项目 A(OAuth2 客户端)运行ning,在 localhost:8001
上有项目 B(OAuth2 服务器)运行ning。 Django 的 sessionid
Cookie 在身份验证过程中被覆盖,导致此错误。
解决方案是 运行 不同主机上的 OAuth2 服务器(我刚刚在 macOS 上的 /private/etc/hosts
中做了一个条目,看起来像:
127.0.0.1 id.localhost
并将 SOCIAL_AUTH_CUSTOM_BACKEND_URL
更新为 http://id.localhost:8001
。