首页 > 解决方案 > 如何使用 Django Web 服务获取和保存令牌

问题描述

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

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

我想在我现有的 Django web 中实现小型 ReactJS 应用程序。在这个阶段,我认为我的小型反应应用程序将需要身份验证令牌来与 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')

标签: djangodjango-rest-framework

解决方案


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

推荐阅读