djoserを使ったDjango REST FrameworkでのJWT認証機能の実装

# djoserとは

[djoser](https://djoser.readthedocs.io/en/latest/index.html)とはDjango REST Framework上での基本的なユーザー認証や登録などの認証周りをサポートしてくれるライブラリです。
カスタムモデルに対しても使え、Djangoのコードを再利用するような形をとるのではなく、Single Page Application(以下SPA)によりフィットするようなアーキテクチャを目指して作られています。

よりシンプルな認証の設定は[こちら](https://qiita.com/KueharX/items/eef29ae0c5c238cbf61c)で解説しています。

今回はdjoserでJWT(JSON Web Token)を使っての認証機能の実装について書きます。

ソースコードは[こちら](https://github.com/Kuehar/djoser_authentication)

また、以下の全てが導入後にエンドポイントとして使えます。

>/users/
/users/me/
/users/confirm/
/users/resend_activation/
/users/set_password/
/users/reset_password/
/users/reset_password_confirm/
/users/set_username/
/users/reset_username/
/users/reset_username_confirm/
/token/login/ (Token Based Authentication)
/token/logout/ (Token Based Authentication)
/jwt/create/ (JSON Web Token Authentication)
/jwt/refresh/ (JSON Web Token Authentication)
/jwt/verify/ (JSON Web Token Authentication)
[Getting started](https://djoser.readthedocs.io/en/latest/getting_started.html)



# 使い方

まずはインストールから。

```
$ pip install -U djoser
```

JWT認証を使うので、simple_jwtも合わせて使う必要があります。

```
$ pip install -U djangorestframework_simplejwt
```

まずはプロジェクトを作り、

```
$ django-admin startproject djoser_authentication
```

プロジェクト内に移動します。

```
$ cd djoser_authentication
```

Djangoの設定を行なっていきます。

```Python:setings.py

from datetime import timedelta # add

   .........

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', # add
    'djoser' # add

]

# add
SIMPLE_JWT = {
    #トークンをJWTに設定
    'AUTH_HEADER_TYPES':('JWT'),
    #トークンの持続時間の設定
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60)
}

# add
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}

```

```Python:urls.py
from django.contrib import admin
from django.urls import path,include #add

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/auth/',include('djoser.urls')), #add
    path('api/auth/',include('djoser.urls.jwt')), #add
]
```

これだけです。


この後にマイグレーションし、Adminユーザーを作ってローカルで起動します。
```
$ python manage.py migrations
```

```
$ python manage.py createsuperuser
Username: Admin
Email address: xxx@email.com
Password:*********** 
```

```
$ python manage.py runserver
```

そしてブラウザで
http://localhost:8000/api/auth/
にアクセスすると・・・

![スクリーンショット 2020-04-19 21.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/52ba5772-fe7d-ffce-b4eb-aa9978804ee2.png)

いつものDjango REST Frameworkの画面ですね。

前回ならばこの後Usersにアクセスした時にユーザー情報の一覧が返ってきていましたが、今回はどうなっているでしょうか？


![スクリーンショット 2020-04-19 21.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/ee8b592f-4801-86f8-64e0-561a686c7fa5.png)

```
    "detail": "Authentication credentials were not provided.
```

と表示されていますね。これは認証の資格が与えられていないから見せられないよ！！ということです。

さて、ではどうしたらユーザー情報を取得できるでしょうか？
それには認証のためのトークンを取得しなければなりません。

なのでトークンを手に入れるために
http://localhost:8000/api/auth/jwt/create
にアクセスします。

![スクリーンショット 2020-04-19 21.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/1c6c12b6-6a7a-25ec-a2f0-0d8cbe8bf09e.png)

すると以上のような画面が出るので先ほど登録したUsernameとパスワードを入力します。

すると、

![スクリーンショット 2020-04-19 21.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/5a7f4b77-6468-83c6-7e85-21e9ff46c90e.png)

以上のようなrefrashとaccessの欄に分けられたトークンが表示されます。

これを使ってターミナル上でユーザー情報を取得してみましょう。
ターミナルでは以下のコマンドを実行してください。

```
curl -LX GET http://127.0.0.1:8000/api/auth/users/me/ -H 'Authorization: JWT xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```
(xxxxにはトークンを入力)

すると、

```
{"email":"xxx@email.com","id":1,"username":"Admin"}
```

先ほど登録したユーザー情報が返ってきました！

この他にも様々な機能がdjoserには存在するので是非使ってみてください！