JWTの紹介
参考https://lion1ou.win/2017/01/18/を紹介。
JSONウェブトークン差とのセッション
セッションID:SESSIONIDはRedisのユーザーIDに保存で生成しました。SESSIONIDは、テープのセッションID、オペレータの身元を確認するために必要なユーザーIDの後にユーザーのために、利用者に返却、セッションIDの後端は同じRedisのセッションIDのかどうかを確認します。
トークンセッションと認証のため、実際には、私たちが必要とするセッションでは、今後の比較のために保存され、およびトークンではないことにします。
トークンの方法を確認するためのアルゴリズムを使用することです、あなたはデータベースに保存する必要はありません。
DRFは、JSONウェブトークントークン差が付属しています
DRFは、トークントークンは、リクエストヘッダに入れて、ユーザとトークンのランダム値との対応を続け、3つのプロジェクトデータベースストアは何の違いをSESSIONIDませんが、トークンDRF新しいテーブル、共通のインタフェースです来てセッションIDを取得または要求に投稿。
使用ジャンゴ・休息・フレームワーク、JWT
ジャンゴ・休息・フレームワークJWT JWT既存の車輪を持っているDjangoは、使用するために使用することができます。
ダウンロードしてインストール
pip install djangorestframework-jwt
アクセス許可を設定する認定
PERMISSION_CLASSESとAUTHENTICATION_CLASSES設定する
には、グローバル設定の証明機関をsettings.py
REST_FRAMEWORK = {
# 权限认证
'DEFAULT_PERMISSION_CLASSES': (
# 使用django标准的 'django.contrib.auth'权限,未认证的用户只读权限
#'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
'rest_framework.permissions.IsAuthenticated',
),
# 身份验证
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
),
}
import datetime
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1), # 指明token的有效期
}
URLの設定
from rest_framework_jwt.views import obtain_jwt_token
urlpatterns = [
url(r'^api-token-auth/', obtain_jwt_token),
]
ローカル認証設定の権限は、あなたもこのような物品の情報として指定されたビューセットでのセットの権限は、情報を得るためにログインする必要性を証明機関を行うことができます。
class ArticleViewSet(mixins.ListModelMixin, mixins.CreateModelMixin, viewsets.GenericViewSet):
queryset = Article.objects.all() # 查询结果集
serializer_class = ArticleSerializer # 序列化类
pagination_class = ArticlePagination # 自定义分页会覆盖settings全局配置的
# 过滤器 过滤,搜索,排序
filter_backends = (DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter)
# 如果要允许对某些字段进行过滤,可以使用filter_fields属性。
#filter_fields = ('title', 'category')
# 使用自定义过滤器
filter_class = AriticleFilter
# 搜索
search_fields = ('title', 'description', 'content')
# 排序
ordering_fields = ('id', 'read_num')
# Token认证
from rest_framework.permissions import IsAuthenticated
permission_classes = (IsAuthenticated,)
テスト
このとき、ダイレクトアクセスhttp://www.qmpython.com:8000/api/articles/のリターン
{
"detail": "身份认证信息未提供。"
}
JWTトークンを取得します
Linuxでは
curl -X POST -H "Content-Type: application/json" -d '{"username":"admin","password":"1q2w3e4r"}' http://www.qmpython.com:8000/api/api-token-auth/
リターン
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiIxMzI4QHFxLmNvbSIsImV4cCI6MTU1OTUyODIxOCwidXNlcl9pZCI6MX0.FXh6MiTlEhx0XMkx7ofcENh0ldFdh2nqWvBLOkCcLOY"}
権利へのアクセスに必要なURL
上記取得したURLトークンは、アクセス権限が必要です
curl -H "Authorization: JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZW1haWwiOiIxMzI4QHFxLmNvbSIsImV4cCI6MTU1OTUyODIxOCwidXNlcl9pZCI6MX0.FXh6MiTlEhx0XMkx7ofcENh0ldFdh2nqWvBLOkCcLOY" http://www.qmpython.com:8000/api/articles/
ます。https://www.jianshu.com/p/24de69d8f495で再現