Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django中基于令牌的身份验证_Django - Fatal编程技术网

Django中基于令牌的身份验证

Django中基于令牌的身份验证,django,Django,我正试图找出在我的django应用程序中实现基于令牌的身份验证的最佳方法。一个非django的外部应用程序正在设置一个带有令牌的cookie,我有一个Web服务,可以根据该令牌检索用户信息。如果用户设置了cookie,他们不需要在我的站点上进行身份验证,应该根据web服务传回的信息自动登录。在我看来,执行实际检查有几个不同的选项,我不确定哪一个是最好的: 编写一个像本文中那样的自定义装饰器,并使用它来代替 需要登录 通过ajax调用在base_站点内调用自定义身份验证方法。在每个页面上,都会进行

我正试图找出在我的django应用程序中实现基于令牌的身份验证的最佳方法。一个非django的外部应用程序正在设置一个带有令牌的cookie,我有一个Web服务,可以根据该令牌检索用户信息。如果用户设置了cookie,他们不需要在我的站点上进行身份验证,应该根据web服务传回的信息自动登录。在我看来,执行实际检查有几个不同的选项,我不确定哪一个是最好的:

  • 编写一个像本文中那样的自定义装饰器,并使用它来代替
    需要登录
  • 通过ajax调用在base_站点内调用自定义身份验证方法。在每个页面上,都会进行检查,如果cookie存在且有效,则用户将自动登录
  • LOGIN\u REDIRECT\u URL
    页面中添加一些javascript,该页面将在ajax调用中检查/验证cookie,并在cookie经过身份验证时自动重定向回引用方

  • 有没有我错过的选择?理想情况下,有一种方法可以将其构建到所需的登录中,而无需编写自定义装饰程序。

    在搜索代码之前,请务必阅读文档。 同时读取提供的Django源代码

    你想创造三样东西

  • 中间件来捕获令牌。这是大部分工作发生的地方。它检查令牌,对其进行身份验证(通过身份管理器确认),然后登录用户

  • 用于查找用户的身份验证后端。这是一个存根。它所做的只是根据需要创建用户。您的身份管理器具有详细信息。您只是在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