Upgrade to Pro — share decks privately, control downloads, hide ads and more …

やさしく入門するOAuth2.0/easy-entry-oauth

marchin
November 17, 2022

 やさしく入門するOAuth2.0/easy-entry-oauth

marchin

November 17, 2022
Tweet

More Decks by marchin

Other Decks in Programming

Transcript

  1. 自己紹介 - 名前: 阿部 真之 - 仕事: 株式会社ゆめみ でAndroidエンジニアしてます -

    最近はサーバサイド Kotlinの仕事も始めました - ほぼサーバーサイドどっぷりです - 趣味 - コーヒー、ビール、アニメ、ゲーム、読書、 etc… - Twitter: @marchin_1989
  2. 前置き - この講座の対象者は、「OAuth2.0という言葉を聞いたことはある」ぐらいの開発者 が対象です - この講座のゴールとしては、ざっくり「OAuthとは?」のイメージを持って帰ってもらう ことです。 - 細かい説明をしすぎると全体像が掴めなくなってしまうため、リクエスト時などのパ ラメータやトークンの渡し方など、説明を端折ってる箇所があります。参考にした文

    献は、スライドの最後に載せてますので、詳しくはそちらでチェックしてください。 - セキュリティに関することなので、慎重にご判断ください。 - ご指摘事項は真摯に受け止めます。間違いを発見した場合や、ご意見がある場合 はご指摘いただけますと幸いです。
  3. 認証と認可の違い - 認証(Authentication) - 誰であるかを確認すること。 - 例: Webサービスのログイン。行政サービス、携帯の契約、本人限定郵便 etcでの本人確認。 -

    認可(Authorization) - 権限の割り当てを行うこと。 - 例: 電車の切符。ディズニーランドの入園チケット。 認可を取得するために、認証をすることがあ るので、混同しやすいが、認証と認可は別 物。
  4. 認証と認可の違い - 認証(Authentication) - 誰であるかを確認すること。 - 例: Webサービスのログイン。行政サービス、携帯の契約、本人限定郵便 etcでの本人確認。 -

    認可(Authorization) - 権限の割り当てを行うこと。 - 例: 電車の切符。ディズニーランドの入園チケット。 OAuth2.0は「認可」についての話です。 ※OAuth2.0は認可の仕組みだが、 OAuth2.0を拡張した認証 用の仕組みとして、OpenIDConnectというものがある。
  5. 認可コードグラント 認可サーバの「認可エンドポイント」に、「認可リクエスト」を送る。 ======================================================== GET /auth ?response_type=code <= ”code” で「認可コードグラント」であることを知らせる &scope=xxx      <=

    アクセストークンのスコープ。アクセス範囲 &client_id=xxx     <= クライアントを特定するための「クライアント ID」 &redirect_uri=https%3A%2F%2Fexample%2Ecom%2Fdev%2Fcallback <=リダイレクトURIを指定 HTTP/1.1 Host: 認可サーバのドメイン ======================================================== ※「state」などの、GETパラメータを省略しています。 ※エンドポイントの「 /auth」パスは仮です。
  6. 認可コードグラント クライアントは、認可サーバの「トークンエンドポイント」に、認可コードをつけてリクエストし、 「アクセストークン」を取得する。 ======================================================== POST /token HTTP/1.1 Host: 認可サーバのドメイン Content-Type:

    application/x-www-form-urlencoded grant_type=authorization_code <= ”authorization_code” で「認可コードグラント」である ことを知らせる &code=xxxx <= 認可コード ======================================================== ※リフレッシュトークンを使って、アクセストークンを再取得することが可能。(オプション) ※クライアントIDとクライアントシークレットが認可サーバに渡され、クライアント認証が実施さ れる。
  7. インプリシットグラント 「認可リクエスト」を送る。 ======================================================== GET /auth ?response_type=token <= ”token” で「インプリシットグラント」であることを知らせる &scope=xxx      <=

    アクセストークンのスコープ。アクセス範囲 &client_id=xxx     <= クライアントを特定するための「クライアントID」 &redirect_uri=https%3A%2F%2Fexample%2Ecom%2Fdev%2Fcallback <=リダイレクトURIを指定 HTTP/1.1 Host: 認可サーバのドメイン ======================================================== ※「state」などの、GETパラメータを省略しています。 ※エンドポイントの「/auth」パスは仮です。
  8. リソースオーナーパスワードクレデンシャルグラント - リソースオーナーのクレデンシャル(パスワードなど)が、クライアントを通して、認可サー バに送られる。 - 非推奨 - このグラントタイプが使えるのは、限定的なユースケース。 - リソースサーバと、認可サーバと、クライアントの提供元が同じ組織

    。 - もしくはもともと、クライアントがユーザー ID、パスワードを保持する実装をしていて、 OAuthに対応する際に移 行するときのつなぎに利用。 - コンフィデンシャル、パブリッククライアント両方で利用可能。 同じ組織
  9. もう一度整理 認可グラント名 特徴 代表的なクライアント 認可コード 認可コードを発行 ネイティブアプリ、SPA、サーバー サイドアプリ ※ただし、PKCEを使うべし。 インプリシット

    アクセストークンを直接発行 なし。使わない方がいい。 リソースオーナーパスワードクレデン シャル リソースオーナーのクレデンシャル をクライアントに直接渡す なし。使わない方がいい。 クライアントクレデンシャル リソースオーナーとクライアントが 同じ サーバーサイドアプリ(クレデン シャルクライアント) どの認可グラントも最終的に アクセストークンを取得する
  10. クライアントを作る側 実装時にやること - OAuthクライアントの登録(リダイレクトURIの作成) - 要件に合わせた認可グラントの決定 - 認可コードグラントを選んだとして、パブリッククライアントにするか、コンフィデンシャルクライアントにするか - 認可エンドポイントへのリクエスト(ブラウザに飛ばす)

    - トークンエンドポイントへのリクエスト - アクセストークンの保存 - リソースサーバーへのアクセス etc… => 大きいサービスであれば、クライアント用のライブラリが存在するので、利用した方がベ ター。まずはしっかりドキュメントを読むこと。 ただし、サービスによっては非推奨であるインプリシットグラントが普通にガイドに書かれていた りするので、認可コードグラントにできないかなどの検討は必要。
  11. 認可サーバーを作る側 実装時にやること - OAuthクライアントの登録情報の管理 - サポートする認可フローの実装 - 認可エンドポイントの実装 - トークンエンドポイントの実装

    - アクセストークンの管理(発行や破棄) - リソースサーバーでのアクセストークンの検証 - そもそも認証機能、認証画面や認可画面の作成 etc…
  12. 認可サーバーを作る側 実装時にやること - OAuthクライアントの登録情報の管理 - サポートする認可フローの実装 - 認可エンドポイントの実装 - トークンエンドポイントの実装

    - アクセストークンの管理(発行や破棄) - リソースサーバーでのアクセストークンの検証 - そもそも認証機能、認証画面や認可画面の作成 etc… => やることが多い。認可サーバの実装ライブラリもあるが、 SaaSの選択肢もある。
  13. 参考文献 ・雰囲気で OAuth2.0 を使っているエンジニアが OAuth2.0 を整理して、手を動かしながら学べる本 , Auth屋, 2019 ・OAuth、OAuth認証、OpenID

    Connectの違いを整理して理解できる本 , Auth屋, 2019 ・OpenID Foundation Japan 翻訳. The OAuth2.0 Authorization Framework. https://openid-foundation-japan.github.io/rfc6749.ja.html, (2022/11/12) ・YouTube. OAuth & OIDC 入門編 by #authlete. https://www.youtube.com/watch?v=PKPj_MmLq5E, (2020/03/17) ・Qiita. OAuth2.0の認可レスポンスとリダイレクトに関する説明 . https://qiita.com/TakahikoKawasaki/items/8567c80528da43c7e844, (2022/11/12) ・Google Identity. Using OAuth 2.0 to Access Google APIs. https://developers.google.com/identity/protocols/oauth2, (2022/11/12)