OAuth2.0について調べ直したのでまとめる

フロー

そもそもOAuth2.0は「認可」のための仕組みであって、「認証」のための仕組みではない。

  • 認可:特定のデータへのアクセス、操作を許可する
  • 認証:ユーザーを確認する(ログイン)

oauth2-flow

図中①〜④のみがOAuth2.0で定義される部分であり、①〜④の各リクエストそれぞれのパラメータも定義されている。それぞれのパラメータの詳細についてはここを参照。

項目解説
クライアントIDの取得前もってクライアントのアクセス権などをリソースサーバーに登録し、クライアントIDを受け取っておく。このクライアントIDは①で送信する。
認可コード要求認可コードを要求。
ユーザーによる認可ここでユーザーの承諾を得る。例えばgithubはログイン画面を表示し、ユーザー名とパスワードを要求(認証)した後、認可するリソースを確認または選択する。
認可コード発行認可コードを発行。
アクセストークン要求アクセストークンを要求。
アクセストークン発行アクセストークンを発行。
アクセストークンによる通信アクセストークンを用いて許可されたリソースにアクセスする。

補足

  • エンドユーザーは正確にはResource Ownerと呼ばれ、リソースサーバーは正確にはAuthorization Server(認可サーバー)、Resource Serverに分離される(参考)
    • OAuth2.0ではAuthorization ServerResource Serverの間の通信については定義されない(あくまで①〜④のみ)
    • 実用上この2つは一つのサーバーで行うことが多い
    • クライアントを含めたこの4つはロールと呼ばれる
  • 実はアクセストークン発行までのフローには他にも複数の方法があり、上記の方法が最も複雑である
    • アクセストークン認可コードが分離されているのは認可コードを用いる以外にも認可を取得する方法が定義されているためである
    • 認可コードによる認可(上図)、インプリシットグラントリソースオーナーパスワードクレデンシャルグラントクライアントクレデンシャルグラントが定義される(総称して認可グラントという)
名前解説
認可コードによる認可上図
インプリシットグラント認可コードを挟まず、直接アクセストークンを発行する(①→④)
リソースオーナーパスワードクレデンシャルグラントユーザーによる認可の際のログイン画面がクライアントによって提供される(認可コードはなく、直接アクセストークンを発行する)
クライアントクレデンシャルグラントユーザーの許可を求めず、ログインに相当する処理をクライアントが直接行う(認可コードはなく、直接アクセストークンを発行する)
  • アクセストークンの発行とともにリフレッシュトークンの発行を受けることがある
    • アクセストークンの有効期限が切れたら、リフレッシュトークンを送信することで、新たにアクセストークンの発行を受けられる
    • 特定の認可グラントに依存しない

OAuth2.0とは

アクセストークンの発行手順に関する仕様である

参考

Built with Hugo
Theme Stack designed by Jimmy