使用jwt来实现登录注册身份认证
配置django rest framework jwt
- github下载
https://github.com/GetBlimp/django-rest-framework-jwt
- 进入虚拟环境
export VIRTUALENVWRAPPER_PYTHON='/usr/local/bin/python3'
export WORKON_HOME='/Users/zhouming/Documents'
source /usr/local/bin/virtualenvwrapper.sh
workon VueShop
-
使用pip进行安装
pip install djangorestframework-jwt
-
在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'
。
- 配置url路由
from rest_framework_jwt.views import obtain_jwt_token
#...
urlpatterns = [
'',
# ...
url(r'^api-token-auth/', obtain_jwt_token),
]
使用 postman来模拟获取jwt token和token认证过程
- 创建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"
}
- 使用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 和消息主体编码方式两部分.
总结
- 获取token的api中不能测试是否用token认证
- debug request.user 可以获取当前用户到底是什么用户。