前回から引き続いて、今回も認証の記事を書いていきたいと思います。
OAuth2.0→OpenID Connectときており、今回はSSOをIDaaSについて書いていきたいと思います。SSO(シングルサインオン)とかは別途かければ書きたいと思います。
SSO(シングルサインオン)
SSOとは
一度のログインでさまざまなWebサービスにログインできる仕組みのことを指します。
方式の種類
こんくらい方法があるんだーに留めておきます。
- エージェント方式
- リバースプロキシ方式
- 代理認証方式
- フェデレーション方式
少し深掘る
サンプルのSSOの実装をしてくれていた方がいたので、それを使っていきます。READMEの通りに進めていけば問題ありません。
consumerとserver側を立ち上げ、consumer側でログインします。
その時にconsumer側に表示される「globalSessionID」とserver側に表示さっる「ID」が一緒なら問題なく動いていることになります。
実際のSSOでは、このIDを使うことで様々なサービスに対して認証なしにログインすることができていることになります。
IAPとの違い
GCPのIAPも画面上はやっていることは同じように見えたので、調べて見ました。
次に、IAP はユーザーのブラウザ認証情報をチェックします。それらが存在しない場合、ユーザーは OAuth 2.0 の Google アカウント ログインフローにリダイレクトされ、トークンが今後のログインのためにブラウザの Cookie に保存されます
https://cloud.google.com/iap/docs/concepts-overview?hl=ja#authentication より引用
つまりSSOで認証されていたら、Cookieにjwtで生成されたIDが存在するはずなので、認証はスキップされる。認証されていなかったらOAuth2.0のログインフローを行うという理解になりました。そしてIAPはその先の権限も制御することができます。
IDaaSとは
認証、ID管理、パスワード管理、SSO、アクセス制御などをまるっとやってくれるサービスのことを指します。
IDaaSの種類
- Firebase
- AWS Cognito
Firebase Authenticationを使った認証
IDトークンの検証をサーバーで行う場合
クライアントからFirebaseにアクセスしIDトークンを生成し、サーバーに送信します。送られてきたIDトークンをサーバーがFirebaseに問い合わせて検証し、検証結果を返すという構成になります。
IDトークンの検証は下記のような実装になります。
client, err := app.Auth(ctx)
if err != nil {
log.Fatalf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
log.Fatalf("error verifying ID token: %v\n", err)
}
IDトークンの検証をCloud Endpointで行う場合
クライアントからFirebaseにアクセスしIDトークンを生成し、Cloud Endpointに送信します。送られてきたIDトークンをCloud EndpointがFirebaseに問い合わせて検証し、検証結果を返すという構成になります。