#ochacafe 5(避けては通れない 認証/認可)に行ってきました
OCHaCafeの第5回に行ってきました。
今回は認証と認可に関するお話で、OAuth2.0やOpenIDConnectを例に説明してくれました。
OAuthについては、以前軽く調べたことがありましたが、サイトごとに言ってることが異なり、結局よくわからずじまいでした。
学んだこと
認証と認可の仕組み
仕組みとしては大きく2つ。
- SAML2.0
ActiveDirectory FederationService(AD FS)と連携してSSOの設定をしたりする等、エンタープライズ向け - OpenIDConnect
他社サービス間で、JSONやRESTベースのメッセージ連携を行う等、コンシューマ向け
OpenIDConnectは、OAuth2.0の拡張
OAuth2.0自体は、システム間での情報の共有や認可を行う仕様
認証と認可の違いは、下記の通り。
- 認証
認証処理をしたときに確定されたユーザ情報を相手に提供すること - 認可
ユーザが、システムに対して自分のリソースにアクセスすることを許可すること
混同しやすいけど、よくよく漢字の意味を考えたらその通りだなって思いました。
OpenIDConnectは、認証+認可に加えて、ユーザ情報をもっているらしい。
OAuthの認証、認可のフロー
例をもとに説明してくれました。
登場人物は4つ。
- リソースオーナ -> 自分
- クライアント -> 街の写真屋の印刷サービス
- リソースサーバ -> 写真共有サイト
- 認可サーバ
認可、認証フローはこんな感じらしい。
- まず自分が、印刷サービスを通じて、写真共有サイトから写真を見ようとする(「連携する」ボタンとか)。
- すると、認可サーバにリダイレクトされ、ログイン画面が出力される。
- ログインすると、印刷サービスに権限与えるよっていう画面が出力される。
- OKすると、認可コードが払い出され、そのまま印刷サービスにリダイレクトされる。
- 印刷サービスは、払い出された認可コードを利用して、認可サーバにアクセストークンのリクエストをする。
- 認可サーバは、認可コードが正しければ、アクセストークンを印刷サービスに払い出す。
- 印刷サービスは、アクセストークンをヘッダ等に付与して、写真共有サイトのAPIをコールする。
- 写真共有サイトは、アクセストークンを検証して、正しければ写真を返す。
アクセストークンの検証方法は2通りあるとのこと。
- JWT(JSON Web Token)であれば、写真共有サイト自身で検証可能、なぜならBase64だから。
- 認可サーバの検証機能を利用する。認可サーバは検証機能のエンドポイントを作るのが規定らしい。
調べたら、作ることは規定ではなさそう。聞き間違い?RFC7662 OAuth 2.0 Token Introspection
ただし、上記フローには注意点があり、認可コードが盗まれたら、誰でもアクセストークンを取得できてしまう。
そのため、RFC7636 Proof Key for Code Exchange by OAuth Public Clientsがあるらしい。
このフローは、下記の通り。
- クライアントは、code_challengeというチャレンジコードを発行し、code_challenge_methodという暗号化方式とチャレンジコードを認可サーバに送る。
- 認可サーバは、チャレンジコードと、暗号化方式を認可コードと紐づけて保存し、認可コードを返却する。
- クライアントは、暗号化方式に従ってチャレンジコードからcode verifierという検証用コードを発行する。
- クライアントは、認可コードと検証用コードを紐づけて認可サーバに送る。
- 認可サーバは、送られてきた検証用コードから暗号化方式に従ってチャレンジコードを作成し、保存していたチャレンジコードと突合する。合致し、かつ認可コードも正しければ、アクセストークンをクライアントに返却する。
ややこしい。。。
以上がOAuthのフローとのこと。
ちなみに、OAuthのフロータイプは全部で6種類あるらしい。多い。。。
OpenID Connectのフロー
OpenID Connectは、追加でIDトークンを発行し、IDトークンを使い回すことで、別クライアントとのID連携ができるようになる。フローは、こんな感じになる。
- ユーザは、印刷サービスサイト上でログインボタンを押す。
- 認可サーバにリダイレクトされ、ログイン画面とともに認可していいかが問われる。
- ログインすると、認可コードが発行され、印刷サービスサイトにリダイレクトされる。
- 印刷サービスは、認可サーバに認可コードを送り、正しければIDトークンとアクセストークンが作成され、印刷サービスに返却される。
- 印刷サービスは、IDトークンから対象ユーザ、宛先、有効期限、署名を検証する。
- 印刷サービスは、認可サーバにアクセストークンを付与したユーザ情報取得リクエストを行う。
- 認可サーバは、必要に応じて追加のユーザ情報を返却する。
- 印刷サービスは、ログイン状態を作成し、ユーザはログイン完了となる。
普段何気なく利用している裏でこんなことが行われていたんですね。
さいごに
今まで何となくでしかわからなかったけれども、今回のOCHaCafeを通じて何となくから大体わかるようになりました。
次回は最終回で、5/10(金) OpenAPIのエコシステムについてです。参加予定です。