赞
踩
基于django-rest-framework的登陆认证方式常用的大体可分为四种:
JWT 是一个开放标准(RFC 7519),它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。
{
"alg": "HS256",
"typ": "JWT"
}
iss (issuer):签发人
exp (expiration time):过期时间,时间戳
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间,时间戳
iat (Issued At):签发时间,时间戳
jti (JWT ID):编号
常用的有iss、iat、exp、aud和sub
同样的,它会使用 base64url 编码组成 JWT 结构的第二部分
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTY3MTU2MTA5LCJlbWFpbCI6ImFkbWluQGV4YW1wbGUuY29tIiwib3JpZ19pYXQiOjE1NjY1NTEzMDl9.VwVwdkQalKip4Cp1_8QjcqR0n_S9w3jgUJEf3oO4PoI
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面。
pip install djangorestframework-jwt==1.11.0
REST_FRAMEWORK = {
# 默认的验证是按照验证列表 从上到下 的验证
'DEFAULT_AUTHENTICATION_CLASSES': (
# 配置JWT认证
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
# 配置session_id认证
'rest_framework.authentication.SessionAuthentication',
# 配置默认的认证方式 base:账号密码验证
'rest_framework.authentication.BasicAuthentication',
)
}
import datetime
JWT_AUTH = {
# 允许刷新token
'JWT_ALLOW_REFRESH': True,
# 每次刷新后,token的有效时间
'JWT_EXPIRATION_DELTA':datetime.timedelta(days=1),
# 生成 token 后,最大的有效时间:在有效期内通过刷新可以保持token有效;超过这个时间后,token失效,刷新也不起作用
'JWT_REFRESH_EXPIRATION_DELTA':datetime.timedelta(days=30),
}
在根路由或子应用项目下配置JWT登录的url路由,本问配置在根urls下:
根路由
from django.contrib import admin
from django.urls import path,include
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
path('api-token-auth/', obtain_jwt_token),
path('admin/', admin.site.urls),
path('',include('rest_app.urls')),
path('api-auth/',include('rest_framework.urls')),
]
#url参数提交
curl http://127.0.0.1:8000/api-token-auth/ -i -X POST -d "username=admin&password=admin"
#json格式提交
curl http://127.0.0.1:8000/api-token-auth/ -i -X POST -H "Content-Type:application/json" -d {\"username\":\"admin\",\"password\":\"admin\"}
新增数据
curl http://127.0.0.1:8000/students/ -X POST -H "Content-Type:application/json" -d {\"name\":\"jwt_stu\",\"age\":24,\"sex\":1} -H "Authorization:JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjcwNTgzNDUyLCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNjcwNDk3MDUyfQ.StD1MHJHTvLgKy6yFEpBnp9D8BP3D_WyXJsVD6ObjBo"
删除数据
curl http://127.0.0.1:8000/students/9/ -i -X DELETE -H"Authorization:JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjcwNTgzNDUyLCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNjcwNDk3MDUyfQ.StD1MHJHTvLgKy6yFEpBnp9D8BP3D_WyXJsVD6ObjBo"
{“detail”:“You do not have permission to perform this action.”}
若无携带token时,会存在此报错
添加配置url
from django.contrib import admin
from django.urls import path,include
from rest_framework_jwt.views import obtain_jwt_token,refresh_jwt_token
urlpatterns = [
path('api-token-refresh/', refresh_jwt_token),
]
使用
curl http://127.0.0.1:8000/api-token-refresh/ -X POST -H "Content-Type:application/json" -d {\"token\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjcwNTgzNDUyLCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNjcwNDk3MDUyfQ.StD1MHJHTvLgKy6yFEpBnp9D8BP3D_WyXJsVD6ObjBo\"}
有些应用中,有专门的服务器认证token,当其他其他服务器得到token之后,传递给专门的服务器认证token
urls
from django.contrib import admin
from django.urls import path,include
from rest_framework_jwt.views import obtain_jwt_token,refresh_jwt_token,verify_jwt_token
urlpatterns = [
path('api-token-auth/', obtain_jwt_token),
path('api-token-refresh/', refresh_jwt_token), # POST刷新JWT的token的url
path("api-token-verify/", verify_jwt_token), # 传递给专门的服务器认证token
path('admin/', admin.site.urls),
path('',include('rest_app.urls')),
path('api-auth/',include('rest_framework.urls')),
]
使用
curl http://127.0.0.1:8000/api-token-verify/ -X POST -H "Content-Type: application/json" -d {\"token\":\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjcwNTgzNDUyLCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNjcwNDk3MDUyfQ.StD1MHJHTvLgKy6yFEpBnp9D8BP3D_WyXJsVD6ObjBo\"}
token正确与错误的效果
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。