使用jwt来实现登录注册身份认证

配置django rest framework jwt

  1. github下载
https://github.com/GetBlimp/django-rest-framework-jwt
  1. 进入虚拟环境
export VIRTUALENVWRAPPER_PYTHON='/usr/local/bin/python3'
export WORKON_HOME='/Users/zhouming/Documents'
source /usr/local/bin/virtualenvwrapper.sh
workon VueShop
  1. 使用pip进行安装
    pip install djangorestframework-jwt

  2. 在setting中设置

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    )
}

其中

'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',

是默认的认证机制,就算不在setting中设置,依然会默认使用这个认证机制。我们添加了其实只有'rest_framework_jwt.authentication.JSONWebTokenAuthentication'

  1. 配置url路由
from rest_framework_jwt.views import obtain_jwt_token
#...

urlpatterns = [
    '',
    # ...

    url(r'^api-token-auth/', obtain_jwt_token),
]

使用 postman来模拟获取jwt token和token认证过程

  1. 创建jwt token
    url: http://127.0.0.1:8000/api-token-auth/
    post 方式
    body类型 序列化的json字符串 application/json
    body值
{
    "username": "zhouming",
    "password": "Mmix1009"
}

输出结果

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo0LCJ1c2VybmFtZSI6Inpob3VtaW5nIiwiZXhwIjoxNTE0NjU2NjE5LCJlbWFpbCI6Ijk0MDgyNTg5N0BxcS5jb20ifQ._2rHky8yHeUD9b02_Azk3lZzhO2OiWgj5s_oHShNWeY"
}
  1. 使用jwt token来请求api
    测试api,可以使用任何api,除了本身获取token的api
    http://127.0.0.1:8000/api-token-auth/
    请求这个api服务器会输出如下响应。
{
    "username": [
        "该字段是必填项。"
    ],
    "password": [
        "该字段是必填项。"
    ]
}

我们用goods api来做请求吧。

3.在app中发起请求,抛出下面问题

RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and you have APPEND_SLASH set.
post请求要用 /作为结尾。
Post请求中为什么要添加
[self.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // header上加入key为content-type值为application/json的项
实际作用是为post请求添加了一个header.key 为 Content-Type ,值application/json,告诉服务器客户端是使用application/json方法进行的编码。
但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分.

总结

  1. 获取token的api中不能测试是否用token认证
  2. debug request.user 可以获取当前用户到底是什么用户。

你可能感兴趣的:(使用jwt来实现登录注册身份认证)