Publicité

実装して理解するLINE LoginとOpenID Connect入門

Deputy General Manager à CTC
13 Mar 2019
Publicité

Contenu connexe

Présentations pour vous(20)

Similaire à 実装して理解するLINE LoginとOpenID Connect入門(20)

Publicité

Plus de Naohiro Fujie(20)

Publicité

実装して理解するLINE LoginとOpenID Connect入門

  1. 実装して理解する LINE Login と OpenID Connect 入門 Naohiro Fujie 2019/03/15
  2. 自己紹介 • 役割 • OpenIDファウンデーション・ジャパン理事、KYC WGリーダー • IDをコアとしたビジネス開発担当。大阪から全国をカバー • 書き物など • Blog:IdM実験室(https://idmlab.eidentity.jp) • 監訳 : クラウド時代の認証基盤 Azure Active Directory 完全解説 • 共著 : クラウド環境におけるアイデンティティ管理ガイドライン • その他活動 • 日本ネットワークセキュリティ協会アイデンティティ管理WG • Microsoft MVP for Enterprise Mobility(Jan 2010 -) • LINE API Expert (Feb 2018 -) • Auth0 Ambassador(Sep 2018 -) Copyright Naohiro Fujie, 2019 2
  3. Agenda • OpenID Connectとは • OpenID Connectとは • OAuth2.0とは • 認証/ID連携(OAuth認証)の誤用理由 • 認証/ID連携に使うには? • OAuthとOpenID Connectの違いの例 • 具体的なフロー • id_token • LINE LoginとOpenID Connect • LINE LoginとOpenID Connect • LINE Login(v2.1)の特徴(クセ) • その他のトピックス • 実習 Copyright Naohiro Fujie, 2019 3
  4. OpenID Connectとは • OpenID Connect 1.0 は, OAuth 2.0 プロトコルの上にシンプル なアイデンティティレイヤーを付与したものである. このプロ トコルは Client が Authorization Server の認証結果に基づいて End-User のアイデンティティを検証可能にする. また同時に End-User の必要最低限のプロフィール情報を, 相互運用可能か つ RESTful な形で取得することも可能にする. • OpenID Connect Core 1.0 日本語訳 • http://openid-foundation-japan.github.io/openid-connect-core- 1_0.ja.html • OpenIDファウンデーション・ジャパン翻訳・教育WG Copyright Naohiro Fujie, 2019 4
  5. OAuth2.0とは • OAuth 2.0 は, サードパーティーアプリケーションによるHTTP サービスへの限定的なアクセスを可能にする認可フレームワー クである. • RFC 6749: The OAuth 2.0 Authorization Framework 日本語訳 • http://openid-foundation-japan.github.io/rfc6749.ja.html • OpenIDファウンデーション・ジャパン翻訳・教育WG Copyright Naohiro Fujie, 2019 5
  6. • サードパーティアプリケーション:OAuthクライアント • HTTPサービス:リソースサーバ • 限定的なアクセス:スコープ • 可能にする(サービス):認可サーバ Copyright Naohiro Fujie, 2019 6 OAuthクライアント (Webアプリ、スマホアプリなど) リソースサーバ (API、サービス) 認可サーバ (OAuthサーバ) 利用者 (リソースオーナー) スコープに基づき許可 (認可) 認可に基づき アクセストークンを発行 アクセストークンを 提示してアクセス リソースを所有
  7. 典型的な使われ方 • カレンダーアプリとGoogle Calendarの連携 Copyright Naohiro Fujie, 2019 7 カレンダーアプリ Google Calendar API Google Account 利用者 (リソースオーナー) カレンダーアプリに対して アイテムの読み出しを許可 認可に基づき アクセストークンを発行 アクセストークンを 提示してアクセス リソースを所有
  8. 認証/ID連携(OAuth認証)の誤用理由① • アクセス許可を行う前にログインする為、アクセストークンを 認証の結果得られたものとして扱ってしまう Copyright Naohiro Fujie, 2019 8 カレンダーアプリ Google Calendar API Google Account 利用者 (リソースオーナー) カレンダーアプリに対して アイテムの読み出しを許可 認可に基づき アクセストークンを発行 アクセストークンを 提示してアクセス リソースを所有 ログイン(認証)
  9. 認証/ID連携(OAuth認証)の誤用理由② • 殆どのサービスがプロファイル取得APIを用意しており、アク セストークンでID情報の取得が可能。アクセストークンの持ち 主=リソースオーナーとみなしてしまう Copyright Naohiro Fujie, 2019 9 カレンダーアプリ Google Account API Google Account 利用者 (リソースオーナー) カレンダーアプリに対して アイテムの読み出しを許可 認可に基づき アクセストークンを発行 アクセストークンを 提示してアクセス リソースを所有 ID情報の取得が可能
  10. よく考えると • アクセストークンは無記名式の切符(誰が持ってきてもOK) • 認可サーバはアクセストークンの有効性検証は出来るが、持参人=発行者 かどうかは検証できない • 何故なら、 • 基本的にアクセストークンは単なる文字列(ハンドルトークン) • ※最近はJWT形式のAssertion Tokenもありますがややこしくなるので割愛 • 認可サーバには以下のように保存されている(イメージ) • Authorization HeaderにBearer xxxx(トークン)って書きますよね? • Bearer(ベアラ)=持参人。持ってきた人に利用を許可する、ということ • 参考)https://idmlab.eidentity.jp/2013/09/bearer-token.html Copyright Naohiro Fujie, 2019 10 アクセストークン 発行者 有効期限 スコープ nQ6wtY3K#UCWRtE6 Yamada Taro 2019-03-15 18:30:00 Email Profie xU,RRjaa.iZLnNgJ Tanaka Hanako 2019-03-15 19:00:00 Calendar.Read
  11. OAuth2.0とは • OAuth 2.0 は, サードパーティーアプリケーションによるHTTP サービスへの限定的なアクセスを可能にする認可フレームワー クである. • RFC 6749: The OAuth 2.0 Authorization Framework 日本語訳 • http://openid-foundation-japan.github.io/rfc6749.ja.html • OpenIDファウンデーション・ジャパン翻訳・教育WG Copyright Naohiro Fujie, 2019 11 認証/ID連携は仕様のスコープ外
  12. 認証/ID連携に使うには? • OAuthクライアントがリソースサーバ側のユーザ情報を取得でき ること • 認証された結果を把握できること • リソースオーナーのID情報を把握できること • OpenID Connectにおける実現方法=アイデンティティレイヤー • ID Token : 認証結果(アサーション)の取得方法の標準化 • UserInfoエンドポイント : ID情報の取得方法の標準化 ※ID TokenにもID情報を含められるがトークンのサイズの巨大化の問題や認証時以外の情報取得に対 応するためUserInfoを使用 Copyright Naohiro Fujie, 2019 12
  13. OpenID Connectとは • OpenID Connect 1.0 は, OAuth 2.0 プロトコルの上にシンプル なアイデンティティレイヤーを付与したものである. このプロ トコルは Client が Authorization Server の認証結果に基づいて End-User のアイデンティティを検証可能にする. また同時に End-User の必要最低限のプロフィール情報を, 相互運用可能か つ RESTful な形で取得することも可能にする. • OpenID Connect Core 1.0 日本語訳 • http://openid-foundation-japan.github.io/openid-connect-core- 1_0.ja.html • OpenIDファウンデーション・ジャパン翻訳・教育WG Copyright Naohiro Fujie, 2019 13 アイデンティティレイヤー = ID Token、UserInfoエンドポイント
  14. OAuthとOpenID Connectの違いの例 (code flow) 項目 OAuth OpenID Connect 認可リクエストの パラメータ scope 任意 必須(openid) redirect_uri 任意 必須 nonce - 任意 セキュリティ対策 (code置き換えへの対策) PKCE (codeとセッション紐づけ) nonce (codeとid_tokenの紐づけ) トークンの種類 access_token (発行対象者の情報なし) id_token (発行対象者の情報あり) プロファイル取得方法 標準化対象外 userInfoエンドポイント Copyright Naohiro Fujie, 2019 14 キモは「scope=openid」と「id_token」と「userInfoエンドポイント」
  15. 具体的なフロー (code flow) LINEの場合のエンドポイント • Authorization Endpoint • https://access.line.me/oauth2/v2.1/authorize • Token Endpoint • https://api.line.me/oauth2/v2.1/token • Profile Endpoint • https://api.line.me/v2/profile Copyright Naohiro Fujie, 2019 15
  16. id_token • JWT(JSON Web Token)形式 • JSON Web Token (JWT) - draft-ietf-oauth-json-web-token-11 日本 語訳 • http://openid-foundation-japan.github.io/draft-ietf-oauth-json-web-token- 11.ja.html • OpenIDファウンデーション・ジャパン翻訳・教育WG • 内部構造 • ヘッダ:署名や暗号化形式など • ペイロード:クレーム(属性)セット、暗号化する場合も • シグニチャ:デジタル署名 • Base64Urlエンコードし、”.”で各パートを連結する • eyJhb—snip--iJ9.eyJpc3—snip--pwIn0.gC4ub--snip--yBm0 Copyright Naohiro Fujie, 2019 16
  17. id_tokenの中身 • jwt.io(by Auth0)とかjwt.ms(by MS) Copyright Naohiro Fujie, 2019 17
  18. id_tokenの中身 Claim Type Value Notes iss https://access.line.me JWTの発行者(issuer)を表す識別子 sub U9f1cac4f164ef3f5c02c92d00 67a11a1 JWTの主体(subject)を表す識別子 LINEの場合はuserId aud 1516319320 JWTの発行先(audience)を表す識別子 LINEの場合はclient_id exp 1552324580 JWTの有効期限(UNIX Time) iat 1552320980 JWTの発行時刻(UNIX Time) nonce 51501f6a-9a12-4d42-ad72- 0d36e44df96f リクエスト時に設定したnonceの値 リクエストと発行されたid_tokenの中の値がマッチ するかどうかを検査し置き換え攻撃を検知する name Naohiro Fujie 名前。LINEの場合は表示名 picture https://profile.line- scdn.net/0m0--snip-- xxx プロファイル写真のURL email naohiro.fujie@eidentity.jp メールアドレス Copyright Naohiro Fujie, 2019 18
  19. LINE LoginとOpenID Connect • 2017年9月 • LINE Login v2.1でOpenID Connectに対応(v2.0まではOAuth2.0) • 2018年3月 • eメールアドレス属性の提供(id_token)に対応 • 2018年6月 • OpenID Certificationにより認定(Basic OP) • https://openid.net/certification/ • 2019年2月 • ブラウザシナリオでのQRコードログインに対応 Copyright Naohiro Fujie, 2019 19
  20. LINE Login(v2.1)の特徴(クセ) • OpenID Provider Configuration Documentから探る • https://access.line.me/.well-known/openid-configuration Copyright Naohiro Fujie, 2019 20 { "issuer": "https://access.line.me", "authorization_endpoint": "https://access.line.me/oauth2/v2.1/authorize", "token_endpoint": "https://api.line.me/oauth2/v2.1/token", "jwks_uri": "https://api.line.me/oauth2/v2.1/certs", "response_types_supported": [ "code" ], "subject_types_supported": [ "pairwise" ], "id_token_signing_alg_values_supported": [ "ES256" ] }
  21. LINE Login(v2.1)の特徴(クセ) パラメータ 値 説明 response_types_supported code Code flowのみサポート subject_types_supported pairwise 同一ユーザでもアプリケーション毎にユニークな subが発行される LINEの場合はアプリ単位というよりプロバイダ単 位なんですが・・・ id_token_signing_alg_values_s upported ES256 ES256(ECDSA using P-256 curve and SHA-256 hash)をサポートとありますが、id_tokenのヘッ ダを見ると、HS256・・・ スペック上はRS256は必須で含まれないとダメな はずなんですが・・・ token_endpoint_auth_methods _supported なし tokenエンドポイントのクライアント認証の方法の 指定がない(OPTIONALなので間違いではない) ので、ドキュメントを見るとclient_secret_post (client_idとclient_secretをPOSTする)が使われ ている。が、実際はclient_secret_basic(BASIC認 証)でも動く Copyright Naohiro Fujie, 2019 21
  22. LINE Login(v2.1)の特徴(クセ) • メールアドレスの取得 • scopeとして指定できるのは、 • openid, email, profileの3種類 • emailを指定しても、あらかじめ許可 設定をしておかないとダメ • Emailはprofileではなくid_tokenのみ に含まれる • そして、tokenレスポンス内のscope にはemailは出てこない(指定していても) Copyright Naohiro Fujie, 2019 22
  23. LINE Login(v2.1)の特徴(クセ) • その他特殊パラメータ • bot_prompt(ボットの友だち追加の方法) • Normal: 同意画面の中でボットと友達になるチェックを入れる • Aggressive: 別画面でボットと友達になる Copyright Naohiro Fujie, 2019 23 Normal Aggressive
  24. LINE Login(v2.1)の特徴(クセ) Copyright Naohiro Fujie, 2019 24 クライアント 自動ログイン *1 メールアドレス+ パスワード QRコード 電話番号 *2 モバイル (標準ブラウザ) ○ モバイル (標準外ブラウザ) ○ PCブラウザ ○ ○ PC版アプリ ○ ○ ○ *1. 自動ログインの動作条件:https://developers.line.biz/ja/faq/#-2017-11-08 *2. 電話番号ログインの条件:PC版LINEでユーザ登録をした場合のみ
  25. Copyright Naohiro Fujie, 2019 25
  26. その他のトピックス • FIDO対応(2019年春予定) • https://engineering.linecorp.com/ja/blog/fido-at-line/ Copyright Naohiro Fujie, 2019 26
  27. 実習 • コードを見ながら解説します Copyright Naohiro Fujie, 2019 27
  28. 実習 • 以下に手順とコードを置いてあります • https://github.com/fujie/line_login • 各自手順に従い作業を進めてください • 不明点はスタッフへお問い合わせください Copyright Naohiro Fujie, 2019 28
Publicité