【问题标题】:How to get and save token using Django Web service如何使用 Django Web 服务获取和保存令牌
【发布时间】:2018-11-16 21:05:25
【问题描述】:

我不确定我是否正确。请给我一个提示或方向。

我使用 Django 设置了我的 Web 服务,还使用 ​​Django REST 框架使用 React Native 制作了移动应用程序。 Django 使用基本会话身份验证,但 Django REST API 使用令牌身份验证来处理来自移动应用程序的请求。

我想在我现有的 Django web 中实现小型 ReactJS 应用程序。在这个阶段,我认为我的小型 React 应用程序将需要身份验证令牌来与 REST api 进行通信。

所以,我的想法是,当用户登录 Web 登录页面时,需要从 API 接收用户的 API 令牌并保存到 cookie 或 localStorage 中,同时在 Django Web 服务中处理正常的登录过程。因为我不想让用户再次登录以在我的网页上运行 react 应用程序以获取身份验证令牌。

我走对了吗?如果是这样,我怎样才能使它起作用?请参考我在 Django login view.py 中的代码 我是否需要一些代码才能获取 API 身份验证令牌并将其保存到客户端?

def Login(request):
    if not request.user.is_authenticated:
        if request.method == "POST":
            email = request.POST['email']
            password = request.POST['password']
            user = authenticate(email = email, password = password)

            if user is not None:
                login(request, user)
                messages.add_message(request, messages.SUCCESS, request.user.nickname + ' Welcome!')
                return redirect('Search')
            else:
                messages.add_message(request, messages.WARNING, 'Please check Email / Password again')
                return redirect('login')
        else:
            form = LoginForm()
            return render(request, 'login.html', {'form': form })
    else:
        return redirect('main')

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您在登录功能中做了一些无用的事情。你可以使用 jwt。它有一些很好的支持登录的功能。在其登录功能中,当使用 post 发送用户名和密码时,它会将令牌返回给客户端。 http://getblimp.github.io/django-rest-framework-jwt/

    你只需要设置 urlpattern

    from rest_framework_jwt.views import obtain_jwt_token
    #...
    
    urlpatterns = [
        '',
        # ...
    
        url(r'^api-token-auth/', obtain_jwt_token),
    ]
    

    它返回令牌

    $ curl -X POST -d  "username=admin&password=password123" http://localhost:8000/api-token-auth/
    

    在其他请求中,如果需要认证,请使用以下请求

    $ curl -H "Authorization: JWT <your_token>" http://localhost:8000/protected-url/
    

    【讨论】:

    • 如果我理解正确,就我而言,Django REST API 的身份验证方式并不重要。我想将分离的小型反应应用程序植入到我现有的网页中,所以我需要某种身份验证方式让反应应用程序在用户登录 Django 网络后使用,以避免再次输入 id/pw。
    • 我没有使用过 react。但是在 Angular 中,我们将接收到的 token 存储在 localStorage 中,并且对于每个请求都需要进行身份验证,首先检查 localStorage 是否存储了 token。如果存储,我们会在请求中使用它。
    【解决方案2】:

    他们都执行相似的任务,几乎没有区别。

    令牌

    DRF 的内置令牌认证

    1. 一个令牌用于所有会话
    2. 令牌上没有时间戳

    DRF JWT 令牌认证

    1. 每个会话一个令牌
    2. 每个令牌的到期时间戳

    数据库访问

    DRF 的内置令牌认证

    1. 获取与令牌关联的用户的数据库访问权限
    2. 验证用户状态
    3. 验证用户身份

    DRF JWT 令牌认证

    1. 解码令牌(获取有效负载)
    2. 验证令牌时间戳(到期)
    3. 数据库访问以获取与有效负载中的 id 关联的用户
    4. 验证用户状态
    5. 验证用户身份

    优点

    DRF 的内置令牌认证

    1. 允许通过替换数据库中的令牌来强制注销(例如:密码更改)

    DRF JWT 令牌认证

    1. 具有过期时间的令牌
    2. 除非令牌有效,否则不会命中数据库

    缺点

    DRF 的内置令牌认证

    1. 数据库命中所有请求
    2. 所有会话的单一令牌

    DRF JWT 令牌认证

    1. 如果不在数据库中跟踪令牌,则无法调用它
    2. 令牌发出后,任何拥有令牌的人都可以提出请求
    3. 规范可以解释,对于如何进行刷新没有达成共识

    参考:Django : DRF Token based Authentication VS JSON Web Token

    【讨论】:

      【解决方案3】:

      我想在我通过长期的研究和研究解决后留下我的答案。我的解决方案很简单。1。设置 DRF 会话身份验证启用。在setting.py中添加一些代码

      REST_FRAMEWORK = {
          # ...
          'DEFAULT_AUTHENTICATION_CLASSES': (
              'rest_framework.authentication.TokenAuthentication',
              'rest_framework.authentication.SessionAuthentication',
          ),
      }
      

      2。将'credentials: "include"' 添加到获取代码中以使用已登录的会话cookie 进行身份验证。

      await fetch(API_URL, {
          credentials: "include"
      })
      

      这个解决方案解决了我的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        • 2014-08-16
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 1970-01-01
        • 2016-12-05
        相关资源
        最近更新 更多