如何使用Django Web服务获取和保存令牌

时间:2018-06-07 04:23:42

标签: django django-rest-framework

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

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

我想在我现有的Django网站上实现小型ReactJS应用程序。在这个阶段,我认为我的小反应应用程序将需要auth令牌与REST api进行自身通信。

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

我是否正确?如果是这样,我怎么能让它有效?请参考Django登录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')

3 个答案:

答案 0 :(得分:0)

您在登录功能中做了一些无用的事情。你可以使用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/

答案 1 :(得分:0)

他们都执行类似的任务,几乎没有差异。

  

令牌

DRF的内置令牌身份验证

  1. 所有会话的一个令牌
  2. 令牌上没有时间戳
  3. DRF JWT令牌身份验证

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

      数据库访问

      DRF的内置令牌身份验证

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

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

          赞成

          DRF的内置令牌身份验证

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

            DRF JWT令牌身份验证

            1. 具有到期时间的令牌
            2. 除非令牌有效,否则没有数据库命中
            3.   

              缺点

              DRF的内置令牌身份验证

              1. 数据库命中所有请求
              2. 所有会话的单一令牌
              3. DRF JWT令牌身份验证

                1. 无法在数据库中跟踪令牌而无法召回令牌
                2. 签发令牌后,拥有令牌的任何人都可以提出请求
                3. 规范可以解释,对如何刷新没有共识
                4. 参考:Django : DRF Token based Authentication VS JSON Web Token

答案 2 :(得分:0)

在我通过长期的研究和学习解决后,我想留下我的答案。我的解决方案非常简单。设置DRF会话认证启用。在setting.py中添加一些代码

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

2。添加&#39;凭据:&#34;包括&#34;&#39;获取代码以使用已登录的会话cookie进行身份验证。

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

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