Django REST framework トークン認証について

SNSアプリを作ってみたいなということで色々勉強しているのですが、
最近またログイン機能等の実装に頭を抱えているので、
そのことについての備忘録を載せようと思います。

トークン認証って何?

なんか良い感じの認証方法らしい。
トークンを使うようにするとセキュリティとしては
パスワードなんかよりマシになるらしい。
メモリの負荷も幾分減るとか。

クライアントからのリクエストに添付されて、
サーバーはクライアントのIDを認識して
クライアントがアクセスできるデータを認識するらしい。

あと、トークンにも
ハードウェアトークン
ソフトウェアトークン
の2つがあり、いづれもセキュリティを高めてくれるらしい。

なんとなくだけど、手元にあるデバイスそのものを
ログイン時の鍵にすることで
他のデバイスからのアクセスがしづらくなるかんじなのかな?

こういうトークンがあることで、
誰かが他人のパスワードやIDを知っていたとしても
ログインするのが難しくなるのかな。

トークンの実装

主にこのサイトを参考にしました。
Pythonのロゴはニシキヘビが由来なので
画像が蛇なのでしょう。

APIエンドポイントとはなんぞや?

シンプルに、URI(URL)と考えると良いのかも。
urls.pyからviews.pyの各classもしくはdefにアクセスする
URLを割り当てたりすることを
エンドポイントの作成と言うっぽい。

settings.pyにこの記述をするのはなぜ?

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ( 
        'rest_framework.authentication.TokenAuthentication', 
    ) 
}

リクエストが来た際にトークンの内容を確認して認証処理をしてくれるため。
しかし、この設定を行うとデフォルトですべてのURIへのリクエストに対してトークン認証を行うため
一部のURIで認証法を変えたい場合は、独自のAuthenticationクラスを定義してその中に認証処理を書き、viewクラスにそのクラスを指定してやると良い。

上記のパラメータ以外にも色々あるらしいので、
その辺は公式ドキュメントを参考にすると良いかもです。

rest_framework.authentication.BasicAuthentication
ログインIDとPWのみの簡単なもの

SettionAuthentication
DjangoのセッションAuthのシステムを使える。
時間が経つとログアウトする仕組みも作れるらしい。

authentication_classes = (FooAuthentication, )s

参考

トークンの取得のエンドポイント作成

URIに直接
rest_framework.authtoken.views.obtain_auth_token
を割り当ててしまうらしい。

あらかじめユーザー登録をしておき、
このURIに対して、
api-token-auth/?username=hogehoge&password=*******
などとしてリクエストを送ることで
ログインしたユーザーがトークンを取得して
様々なページにアクセスが可能になるという具合らしいです。

@receiver(post_save, sender=settings.AUTH_USER_MODEL)とは?

post_saveというのは、django.db.models.signalsと関連する機能。
@receiver(関数を実行するタイミング, sender=関数に渡すモデル)
みたいな感じかと思います。

post_save…save()メソッドの最後に関数を実行する

Django組み込みのトークンとJSON Webトークンの違い

Django組み込みの場合、データベースを使用してトークンを検証する必要があるが、
JWT認証の場合はその必要がない。
公式ドキュメントより。


なんかどうしたらいいか分からない状態が結構続いてしまったので、
できるだけゆっくり理解しながら進もうと思います。
最近Reactのtutorialを一通り読み終えて、実践段階に足を踏み入れかけている状態なので、
バックエンドのログイン機能等の実装はスピーディーに終えたいところなのですが…

APIサーバー構築は初めてなので
また新しい知識を取り入れないといけないので
いろいろ苦労してます…

プログラム書く時間よりもgoogleの時間の方が長いんですよね…

この記事が気に入ったらサポートをしてみませんか?