环境依赖:
django
rest-framework
rest-framework-jwt
推荐文章:
Django REST framework的各种技巧
JSON Web Tokens in django系列1-4
django-restframework-jwt文档
准备
注意django-restframework-jwt需要配合restframework使用.
settings.py:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
通过用户名和密码获得token
jwt已经封装了获取token的代码,我们只需要发送用户名和密码给对应的API接口,就可以获取token:
urls.py
from rest_framework_jwt.views import obtain_jwt_token, verify_jwt_token
urlpatterns = [
url(r'^$', include(router.urls)),
url(r'^api-auth/', obtain_jwt_token), # POST email=email&password=password
]
可以使用python manage.py createsuperuser
创建一个用户,然后发送用户名和密码测试一下:
curl -X POST -d "email=admin&password=password123" http://localhost:8000/api-auth/
这会返回一个包含token的json字符串。
使用token访问被保护的url
设置某些view的权限(permission_classes)为permissions.IsAuthenticated
,那么没有提供token而访问被保护的view是不被允许的.
你可以设置用户注册的权限为permissions.AllowAny
,这样用户可以通过用户名和密码拿到token,在之后访问被保护的view时,将token作为身份凭证发送给服务端(rest-framework会自动验证token是否有效,如果在settings.py中做了准备中的配置的话)
curl -H "Authorization: JWT your_token" http://localhost:8000/some_api/
将上一步返回的token放在请求头中(JWT
这个前缀可以在settings.py中被更改,详情见官方文档)