Django中基于令牌的身份验证
我正试图找出在我的django应用程序中实现基于令牌的身份验证的最佳方法。一个非django的外部应用程序正在设置一个带有令牌的cookie,我有一个Web服务,可以根据该令牌检索用户信息。如果用户设置了cookie,他们不需要在我的站点上进行身份验证,应该根据web服务传回的信息自动登录。在我看来,执行实际检查有几个不同的选项,我不确定哪一个是最好的:Django中基于令牌的身份验证,django,Django,我正试图找出在我的django应用程序中实现基于令牌的身份验证的最佳方法。一个非django的外部应用程序正在设置一个带有令牌的cookie,我有一个Web服务,可以根据该令牌检索用户信息。如果用户设置了cookie,他们不需要在我的站点上进行身份验证,应该根据web服务传回的信息自动登录。在我看来,执行实际检查有几个不同的选项,我不确定哪一个是最好的: 编写一个像本文中那样的自定义装饰器,并使用它来代替 需要登录 通过ajax调用在base_站点内调用自定义身份验证方法。在每个页面上,都会进行
需要登录
李>
LOGIN\u REDIRECT\u URL
页面中添加一些javascript,该页面将在ajax调用中检查/验证cookie,并在cookie经过身份验证时自动重定向回引用方有没有我错过的选择?理想情况下,有一种方法可以将其构建到所需的登录中,而无需编写自定义装饰程序。在搜索代码之前,请务必阅读文档。 同时读取提供的Django源代码 你想创造三样东西
identity\u manager.get\u attributes
是我们编写的一个单独的类,用于验证令牌并从IM源获取用户的详细信息。当然,出于测试目的,必须对其进行模拟
这是一个后端(已编辑)
这不会实质性地改变身份验证或授权的装饰器
为了确保这一点,我们实际上从我们的数据库中刷新了用户和组信息
身份管理器
请注意,中间件针对每个请求运行。有时,可以将令牌传递给支持的authenticate
方法。如果令牌存在于本地用户数据库中,则可以在不联系身份管理器的情况下继续请求
然而,我们在identity manager中有复杂的规则和超时,因此我们必须检查每个令牌以确保其有效。一旦中间件确定令牌有效,我们就可以允许后端执行任何附加处理
这不是我们的实时代码(它有点太复杂了,不能作为一个很好的示例。)后端可以简化为user、\u0=user.objects.get\u或\u create(username=credentials['remote\u user'])
from django.contrib.auth import authenticate, login
class CookieMiddleware( object ):
"""Authentication Middleware for OpenAM using a cookie with a token.
Backend will get user.
"""
def process_request(self, request):
if not hasattr(request, 'user'):
raise ImproperlyConfigured()
if "thecookiename" not in request.COOKIES:
return
token= request.COOKIES["thecookiename"]
# REST request to OpenAM server for user attributes.
token, attribute, role = identity_manager.get_attributes( token )
user = authenticate(remote_user=attribute['uid'][0])
request.user = user
login(request, user)
class Backend( RemoteUserBackend ):
def authenticate(**credentials):
"""We could authenticate the token by checking with OpenAM
Server. We don't do that here, instead we trust the middleware to do it.
"""
try:
user= User.objects.get(username=credentials['remote_user'])
except User.DoesNotExist:
user= User.objects.create(username=credentials['remote_user'] )
# Here is a good place to map roles to Django Group instances or other features.
return user