【发布时间】:2015-01-05 14:08:25
【问题描述】:
我正在构建一个带有 API 后端(使用 DRF 构建)和 angularjs 客户端的 django 应用程序。我的目标是使用 JWT 代替会话完全解耦服务器和客户端。我正在尝试将python-social-auth(PSA) 与django-rest-framework-jwt(DRFJWT) 集成,所以我的目标是让身份验证流向这个:
用户通过 Angular 客户端使用电子邮件/facebook 登录 -> 客户端将表单发布到 PSA 的 url -> PSA 登录/创建用户 ->[!] DRFJWT 创建令牌,然后将其发送回客户端 -> 客户端将令牌存储在本地存储中然后在每个请求中使用令牌
[!]:这是我目前正在苦苦挣扎的地方。我的想法是我可以像这样修改PSA中的do_complete方法
from rest_framework_jwt.utils import jwt_payload_handler, jwt_encode_handler
def do_complete(backend, login, user=None, redirect_name='next',
*args, **kwargs):
# pop redirect value before the session is trashed on login()
data = backend.strategy.request_data()
redirect_value = backend.strategy.session_get(redirect_name, '') or \
data.get(redirect_name, '')
is_authenticated = user_is_authenticated(user)
user = is_authenticated and user or None
partial = partial_pipeline_data(backend, user, *args, **kwargs)
if partial:
xargs, xkwargs = partial
user = backend.continue_pipeline(*xargs, **xkwargs)
else:
user = backend.complete(user=user, *args, **kwargs)
if user_is_active(user):
# catch is_new/social_user in case login() resets the instance
is_new = getattr(user, 'is_new', False)
social_user = user.social_user
login(backend, user, social_user)
payload = jwt_payload_handler(user)
return { 'token': jwt_encode_handler(payload) }
这是我想要完成的唯一方法吗?
我还想知道,从最佳实践的角度来看,是否可以使用会话来管理管道和 JWT 进行身份验证?
【问题讨论】:
-
login(backend, user, social_user)调用 Djangologin方法(来自django.contrib.auth应用程序),该方法使用用户会话来跟踪用户状态。你我可能会将SOCIAL_AUTH_LOGIN_REDIRECT_URL设置为/auth-payload,然后在那个视图中我会返回当前用户的有效负载。
标签: python django jwt python-social-auth