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

仕様が読めるようになるOAuth2.0、OpenID Connect 入門

Auth屋
October 05, 2023

仕様が読めるようになるOAuth2.0、OpenID Connect 入門

2023/10/05 Offersさんのイベントでの資料です。
https://offers.connpass.com/event/295782/

イベント後の満足度アンケート(5点満点)の結果は以下になります。
5点: 49%
4点: 39%
3点: 8%
2点: 4%

こちらのスライドの内容は以下の本の抜粋になります。デモの内容、このスライドでは触れていないことについてご興味ある場合は以下の本をご参照ください。
https://authya.booth.pm/items/1296585
https://authya.booth.pm/items/1550861

本発表で扱っていないセキュリティに関しては以下の本がおすすめです。
https://authya.booth.pm/items/1877818

本の評判
https://togetter.com/li/1477483

Auth屋

October 05, 2023
Tweet

More Decks by Auth屋

Other Decks in Technology

Transcript

  1. 目次 OAuth • 登場人物 • OAuthとは何か • OAuthのメリット • OAuthのフロー

    • OAuthでログイン? OpenID Connect • OpenID Connectとは • IDトークンとは 8
  2. OAuthの登場人物 15 ユーザー (リソースオーナー) 画像編集アプリ (クライアント) Google OAuth (認可サーバー) Google

    Photo API (リソースサーバー) アプリのユーザー Google Photo のユーザー (リソースの所有者)
  3. OAuthの登場人物 | 2つのクライアント 17 ユーザー (リソースオーナー) 画像編集アプリ (クライアント) Google OAuth

    (認可サーバー) Google Photo API (リソースサーバー) クライアントシークレットを安 全に保持できない パブリッククライアント
  4. OAuthの登場人物 | 2つのクライアント 18 ユーザー (リソースオーナー) 画像編集アプリ (クライアント) Google OAuth

    (認可サーバー) Google Photo API (リソースサーバー) クライアントシークレットを 安全に保持できる コンフィデンシャルクライアント
  5. OAuthとは何か • RFC6749「OAuth2.0 はサードパーティアプリケーションによる HTTP サービスへの限定的なアクセスを可能にする認可フレームワークである」 • 例「OAuth2.0は画像編集アプリによるGoogle Photo への限定的なアクセ

    ス(Aさんの画像のダウンロード)を可能にするアクセストークンの発行 ルールである」 20 RFC6749の用語 画像編集アプリの例 サードパーティアプリ 画像編集アプリ HTTPサービス Google Photo 限定的なアクセス Aさんの画像のダウンロードのみ 認可フレームワーク アクセストークンの発行ルール
  6. OAuth の流れ 21 ユーザー (リソースオーナー) 画像編集アプリ (クライアント) Google OAuth (認可サーバー)

    Google Photo API (リソースサーバー) Google Photoから写真を ダウンロード
  7. OAuth の流れ 23 ユーザー (リソースオーナー) 画像編集アプリ (クライアント) Google OAuth (認可サーバー)

    Google Photo API (リソースサーバー) Google Photoのリソース オーナーとしての認証
  8. OAuth の流れ 24 ユーザー (リソースオーナー) 画像編集アプリ (クライアント) Google OAuth (認可サーバー)

    Google Photo API (リソースサーバー) 画像編集アプリにGoogle Photoの 画像のダウンロードを許可します か?
  9. OAuthがある場合 39 39 ユーザー 画像編集アプリ Google OAuth Google Photo API

    Aさんの画像の ダウンロードだけを 一定期間できる
  10. クライアントの登録 46 { "web": { "client_id": "7429476-bb2mshkghp5bje196p9pvugi1av19.apps.googleusercontent.com", "project_id": "storied-box-250407", "auth_uri":

    "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_secret": "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uww", "redirect_uris": [ "https://offers.example.com/callback" ] } }
  11. スコープ • アクセストークンに紐付ける権限 • 権限の内容、表現方法は仕様では規定されていない(サービスごとに違う) • Googleの例 https://www.googleapis.com/auth/photoslibrary.readonly Google Photoのリソースに対する読み込み権限

    https://www.googleapis.com/auth/photoslibrary.appendonly Google Photoのリソースに対する書き込み権限 https://www.googleapis.com/auth/photoslibrary.sharing Google Photoのリソースに対するアルバムの作成、共有などの権限 63
  12. SNSの例 | 登場人物 114 ほげアプリ (クライアント) 認可サーバー プロフィール API (リソースサーバー)

    SNSのユーザー ほげアプリのユーザー Aさん (リソースオーナー) 「SNS アカウントでログ イン」機能 SNS ユーザーの プロフィール情報を 提供するAPI
  13. 登場人物 • OAuthとOpenID Connectでは登場人物の呼び名が異なります 126 OAuth リソースオーナー OIDC エンドユーザー OAuth

    クライアント OIDC リライング・パーティ OAuth 認可サーバー OIDC IDプロバイダ OAuth リソースサーバー OIDC (User Info API)
  14. IDトークンとは 誰が発行する? • IDプロバイダ 誰が何のために使うのか? • リライング・パーティがエンドユーザーを認証するため どんな情報が含まれているか • ユーザーID

    • トークンの有効性(有効期限、発行日時) • トークン発行者ID、トークン受領者ID • 改ざんを防ぐための署名 • トークンのフォーマットに関する情報 130
  15. IDトークンとは 形式は? • Json Web Token(JWT) • .(ドット)で区切られる3つのパートからなる • ヘッダーとペイロードはBase64エンコードされたJSON

    eyJhbGci…QifQ. eyJpc3M…I6MTU2MzH0.Bx9Eds2f…CeekBuYokY Bx9Edsrn2f3・・・・・・CeekBuYokYnxt4A3XRSSfcpvg 131 ヘッダー ペイロード 署名
  16. IDトークン | ペイロード { "iss": "https://accounts.google.com", "aud": "6727653....ibqog5.apps.googleusercontent.com", "sub": "103567684956724214211",

    "iat": 1563792930, "exp": 1563796530, } 136 Audience: IDトークンを受け取るリライング・パー ティのクライアントID
  17. IDトークン | ペイロード { "iss": "https://accounts.google.com", "aud": "6727653....ibqog5.apps.googleusercontent.com", "sub": "103567684956724214211",

    "iat": 1563792930, "exp": 1563796530, "email": "[email protected]" "name": "Auth屋", "given_name": "屋", "family_name": "Auth" } 140 scope(email profile)を 追加すると、対応して情報が増える
  18. IDトークン | 署名 なぜ署名が必要? • sub(ユーザー識別子)、iss(発行者)、aud(発行先)などが改ざんされ ていないことを保証 署名アルゴリズムは? • ヘッダーに記載(RS256)

    署名検証用の公開鍵は? • IDプロバイダが公開 • https://www.googleapis.com/oauth2/v3/certs Bx9Edsrn2f3・・・・・・CeekBuYokYnxt4A3XRSSfcpvg 141
  19. IDトークン | ペイロード { "iss": "https://accounts.google.com", ← 発行者 "aud": "6727653....ibqog5.apps.googleusercontent.com",

    ← 受領者 "sub": "103567684956724214211", ← ユーザーID "iat": 1563792930, ← 発行日時 "exp": 1563796530, ← 有効期限 } 入れ替えられても、気付ける仕組みがある 署名により改ざんも気付ける 152
  20. RFC6749 (OAuth2.0の基本仕様) 保護されたリソースにアクセスする為にリソースオーナーの クレデンシャルを使う代わりに, クライアントはアクセス トークンを取得する. アクセストークンとは, ある特定のス コープ, 期間およびその他のアクセス権に関する情報を示す

    文字列である. アクセストークンはリソースオーナーの同意 をもって認可サーバーからサードパーティークライアントへ 発行される. クライアントはアクセストークンを用いてリ ソースサーバーがホストしている保護されたリソースにアク セスする. 156