YAPC::Asia Tokyo 2014 で話したスライドです。 http://yapcasia.org/2014/talk/show/cc57f3ca-01b8-11e4-b7e8-e4a96aeab6a4
OAuth/OpenID Connectを用いてID連携を実装するときに気を付けることRyo Ito(@ritou)YAPC::Asia Tokyo 2014 1
View Slide
用語定義 :ソーシャルログイン• FacebookやGoogleなど外部サービスの認証結果やユーザーの属性情報を自サービスの認証や新規登録に利用するしくみYAPC::Asia Tokyo 2014 2
内容• ソーシャルログインを利用する際に気をつけること• パスワード認証しているサービスへのソーシャルログインの導入• 導入事例YAPC::Asia Tokyo 2014 3
自己紹介• Ryo Ito (@ritou) ← あーるいとう or りとう• OpenID Foundation Japan : Evangelist• http://www.openid.or.jp/• エンジニア@株式会社ミクシィ• CPAN• OAuth::Lite2• OIDC::LiteYAPC::Asia Tokyo 2014 4
YAPC::Asia Tokyo 2013• OpenID Connect これが最新のOpenID仕様だッ!• www.slideshare.net/ritou/yapc2013-ritou-oidcYAPC::Asia Tokyo 2014 5
ソーシャルログインを利用する際に気をつけることhttps://qiita.com/http://yapcasia.org/2014/loginYAPC::Asia Tokyo 2014 6
の前に、ソーシャルログインの目的• 利便性向上• アカウント登録のハードルを下げる• 属性情報の利用• コスト削減• 認証機能の実装コスト(まじめにやると高くつく)YAPC::Asia Tokyo 2014 7
OAuth DanceYAPC::Asia Tokyo 2014 8http://alpha.mixi.co.jp/entry/2013/12020/
実装• 各サービスのSDKを利用• WebApplicationFrameworkのプラグイン• 各言語の汎用ライブラリYAPC::Asia Tokyo 2014 9
気をつけること• UI/UX : 使いやすく• セキュリティ : 安全にYAPC::Asia Tokyo 2014 10
UI/UX1. 連携キャンセル時の挙動2. 未登録ユーザーの扱い3. 前回のログイン情報の取り扱いYAPC::Asia Tokyo 2014 11
連携キャンセル時の挙動YAPC::Asia Tokyo 2014 12https://www.timeticket.jp
連携キャンセル時の挙動• 果たしてエラーなのか?ユーザーの意図は?• Permission多すぎでやめた -> 使うのやめたい• このアカウントじゃなかった! -> やりなおしたい• error=access_denied などで判別可能• 次のアクションにつなげられるようにすべきYAPC::Asia Tokyo 2014 13
連携キャンセル時の挙動YAPC::Asia Tokyo 2014 14http://yapcasia.org/2014/login?error=access_denied
未登録ユーザーの扱いYAPC::Asia Tokyo 2014 15https://miil.me/
未登録ユーザーの扱い• エラー扱いや新規登録からやり直して系の文言• 新規登録フローに誘導するのも効果的• 属性情報もうまく使って最短経路を提供• どこまで進めてよいかは要検討• 利用規約へ同意するタイミング• 勝手に登録完了?嫌がるユーザーもいるYAPC::Asia Tokyo 2014 16
過去のログイン情報の取り扱い• 多くのサービスはログアウト後 一覧からやりなおし• 以前から、アイコンが並ぶUIは混乱を招くと言われていた 「どのアカウント使ってたっけ?」• 前回利用したサービスを保存して利用する• デフォルト表示 or 強調表示YAPC::Asia Tokyo 2014 17http://janrain.com/product/social-login/
セキュリティ• Webアプリ• リダイレクト時のCSRF対策• ネイティブアプリ• バックエンドサーバーとのやりとりYAPC::Asia Tokyo 2014 18
WebアプリとCSRF• OAuthのセキュリティ強化を目的とする拡張仕様を導入しました - mixi Engineers' Blog• http://alpha.mixi.co.jp/entry/2013/12020/• 最初の部分でこの問題について触れている• OAuth2.0で強制連携させるCSRFの影響と、その対策について• http://subtech.g.hatena.ne.jp/mala/20140724/1406209989YAPC::Asia Tokyo 2014 19
CSRFフローYAPC::Asia Tokyo 2014 20http://alpha.mixi.co.jp/entry/2013/12020/
リスク• 第3者のアカウントでログインさせられる• クレカ情報、住所情報を知られるリスク• 第3者のソーシャルログイン アカウントと連携• 第3者がログインできる -> アカウントのっとりYAPC::Asia Tokyo 2014 21
対策• 通常のCSRF対策をクロスドメインで行う必要がある• 外部サービスに引き回すstateパラメータを用いる• セッションと紐づけておいて戻ってきたら検証• stateパラメータにセッションIDそのものは利用しないYAPC::Asia Tokyo 2014 22
YAPC::Asia Tokyo 2014 23http://alpha.mixi.co.jp/entry/2013/12020/CSRF対策により検知可能
ネイティブアプリとソーシャルログインソーシャルログインを認証に利用する場合、バックエンドサーバーとのやりとりが必要となる1. アプリはAccess Tokenなどをバックエンドサーバーに送信2. バックエンドサーバーはユーザー識別子を取得3. 紐づく自サービス内のユーザーを特定し、セッション発行などの処理YAPC::Asia Tokyo 2014 24
ネイティブアプリとソーシャルログインYAPC::Asia Tokyo 2014 25UserNativeAppIdPBackendServer「○○でログイン」認証処理、アクセス権限への同意などトークンなどをやりとりBackend Serverに送信ログイン情報などユーザー識別子を要求
連携方法は各サービスによって異なる• SDKなどで取得したAccess Tokenを送信• (UI)WebViewでWebアプリ向けのAuthorizationCodeを取得して送信YAPC::Asia Tokyo 2014 26
SDKなどで取得したAccess Tokenを送信• 大手BaaSでも採用されている方式• SDKやOSネイティブ機能でAccess Tokenを受け取る• 「Token Replace Attack(置換攻撃)」のリスク• 他のアプリ向けのAccess Tokenによりアカウントののっとりが行われる可能性がある• バックエンドサーバーは必ずそのAccess Tokenが自らのアプリに対して発行されたことを確認する• 通信路が云々…YAPC::Asia Tokyo 2014 27
SDKなどで取得したAccess Tokenを送信YAPC::Asia Tokyo 2014 28UserNativeAppIdPBackendServer「○○でログイン」(SDK)認証処理、アクセス権限への同意などAccess Token要求Backend ServerにAcess Tokenを送信ログイン情報などAccess Tokenの発行先を確認ユーザー識別子を要求
(UI)WebViewでWebアプリ向けのAuthorization Codeを取得して送信• 昔から行われている方式の一つ• Client Credential(Client Secret)をアプリで持つ必要がないことは良い• Authorization Code -> Access Tokenの変換はバックエンドサーバーが行う• WebViewで外部サービスの画面表示するのはフィッシングなどの面から良くないYAPC::Asia Tokyo 2014 29
(UI)WebViewでWebアプリ向けのAuthorization Codeを取得して送信YAPC::Asia Tokyo 2014 30UserNativeAppIdPBackendServer「○○でログイン」(WebView)認証処理、アクセス権限への同意などAuthorization Code取得Backend ServerにAuthorization Codeを送信ログイン情報などAccess Tokenと交換ユーザー識別子を要求
ネイティブアプリで気をつけること• Access Tokenを送信する場合は検証が必要• Authorization Codeを送る方法は安全だが、(UI)WebViewにて認証画面や同意画面を出すのは良くないすっきりしないのは、ソーシャルログインを提供する側がネイティブアプリ + バックエンドの利用を想定していないから…YAPC::Asia Tokyo 2014 31
Googleの場合• GoogleではProjectに複数Clientがぶら下がる• Webアプリ• iOSアプリ• Androidアプリ• ネイティブアプリ向けSDKからWebアプリ向けのAuthorization Codeを取得可能• バックエンドサーバーがAuthorization CodeからAccessTokenに変換• (おまけ)ユーザー識別子の取得だけならID Tokenを利用するのが便利(OpenID Connect仕様をサポート)YAPC::Asia Tokyo 2014 32
Googleの場合YAPC::Asia Tokyo 2014 33UserNativeAppIdPBackendServer「○○でログイン」(SDK)認証処理、アクセス権限への同意などAuthorization Code取得Backend ServerにAuthorization Codeを送信ログイン情報などAccess Tokenと交換ユーザー識別子を要求
パスワード認証しているサービスへのソーシャルログインの導入• どの外部サービスを利用?• ソーシャルログインによりどの機能を省略(代替)する?• どの機能から?• どのデバイスから?YAPC::Asia Tokyo 2014 34
どの外部サービスを利用?• サービスの特性• 利用できる属性情報• プロフィール情報• メールアドレス• ニックネームYAPC::Asia Tokyo 2014 35
ソーシャルログインによりどの機能を省略(代替)する?• 認証• 全ての認証• 最初のログインで全ての機能が使える• 強度の低い認証• 最初のログインである程度までの機能が使える• 重要な処理の前に二段階認証や、パスワード確認• メールアドレス確認• Googleが自社で提供しているGmailのメアド• Facebookが確認済みのメアド• 属性情報の入力• 姓名、ニックネームなどYAPC::Asia Tokyo 2014 36
どの機能から?• 既存アカウントとの連携 & ログイン• 既存ユーザーの利便性向上• 新規登録より先に実装しても問題ない• 新規登録• 新規ユーザーの利便性向上YAPC::Asia Tokyo 2014 37
どのデバイスから?• スマートフォン向けWebアプリ• 文字入力が面倒• PCより新規登録時のハードルが高い(?)• PC向け Webアプリ• ネイティブアプリ• ログアウトの機会は比較的少ないYAPC::Asia Tokyo 2014 38
導入事例YAPC::Asia Tokyo 2014 39
mixiとGoogleアカウント• 2014/08/04 プレスリリースhttp://mixi.co.jp/press/2014/0804/12248/YAPC::Asia Tokyo 2014 40
Googleアカウントでログイン/登録が可能YAPC::Asia Tokyo 2014 41
未連携&キャンセルYAPC::Asia Tokyo 2014 42
mixiのユーザー登録/認証• 登録時の確認項目• メールアドレス : 確認用メールの送信• 電話番号の確認 : SMS/IVR• メールアドレス/パスワードで認証• 各種設定変更やセンシティブな処理の前にパスワード確認YAPC::Asia Tokyo 2014 43
mixiのユーザー登録/認証• 登録時の確認項目• メールアドレス : 確認用メールの送信• 電話番号の確認 : SMS/IVR• メールアドレス/パスワードで認証• 各種設定変更やセンシティブな処理の前にパスワード確認• ↑パスワード撤廃失敗YAPC::Asia Tokyo 2014 44
実装順序• 機能• 既存アカウントとの連携/ログイン -> 新規登録• デバイス• スマートフォンブラウザ -> ???YAPC::Asia Tokyo 2014 45
まとめ• UI/UXのちょっと改善できそうな点と、セキュリティ面で気をつけてほしい点を紹介した• 既存のサービスに導入する際には、ソーシャルログインによりどの機能を置き換えられるかを考慮すべき• mixiがGoogleアカウントに対応したことを紹介YAPC::Asia Tokyo 2014 46
終わり• 気になった点があれば声をかけてください• Twitterで @ritou 宛のメンションでもかまいません• 「社内勉強会に講師を派遣します」• http://www.openid.or.jp/blog/2014/06/oidfj-supports-internal-tech-seminar.htmlYAPC::Asia Tokyo 2014 47