はじめに
前回記事にしたGoogleアカウントを使ったID連携はOAuth2.0 Authorization Code Flowを使用したOIDC認証フローですが、今回は別形式のSAMLを使ったID連携を試してみます。
SAML(さむる)とは?
丸投げですが、SAMLの細かな説明は以下ページを見ていただければ、と思います。
まずは、OAuth 2.0
、OIDC
、SAML
の役割の違いをざっくりと理解しておくと良いのではと思います。
今回はOAuth 2.0
、OIDC
、SAML
の役割をClaudeに要約させてたいので、参考までに載せておきます!
OAuth 2.0
項目 | 内容 |
---|---|
用途 | APIアクセスの認可 |
仕組み | アクセストークンでリソースにアクセス |
特徴 | 認証はしない、認可専用 |
OIDC(OpenID Connect)
項目 | 内容 |
---|---|
用途 | 認証 + 認可 |
仕組み | OAuth 2.0 + IDトークン(ユーザー情報) |
特徴 | SSOに最適 |
SAML
項目 | 内容 |
---|---|
用途 | エンタープライズSSO |
仕組み | XMLベースのアサーション(認証証明) |
特徴 | 古いシステムに強い |
やってみた!
では、やってみます。
最初はOktaでやってみようかと思ったのですが、gmailアカウントだとアカウント登録できないようでしたので、今回はAuth0を使ってみました。
Auth0アプリケーションの作成
最初にアプリケーションを作っていきます。
他のサービスでいうクライアントに相当するところなのかな。
名前は適当に。今回はSPAを選びます。
Application URIs設定
次にSettings
のApplication URIs
を以下のように設定します。
Allowed Callback URLs
のところは、SAML専用のエンドポイントがあるので注意ですね!
項目 | 設定値 |
---|---|
Application Login URI | https://[ドメイン名].auth.ap-northeast-1.amazoncognito.com |
Allowed Callback URLs | https://[ドメイン名].auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse |
Allowed Logout URLs | http://localhost:3000 |
Allowed Web Orgins | http://localhost:3000 |
次に、Addon
からSAML2
を選択し、Setting
タブ内から、ログアウト時にURIの指定をします。
{
"logout": {
"callback": "http://localhost:3000",
"slo_enabled": "false"
}
}
この設定がなぜ必要なのかが分からず、設定の仕方が合ってるか悩ましいのですが、この設定がないとログアウト時の画面遷移が正しく動作しませんでした。
SAML IdPメタデータファイル取得
最後に、Cognito設定時に利用するメタデータファイルをダウンロードしておきます。
このファイルにはSAML認証時のエンドポイントや、署名検証を行うX509証明書などが記載されています。
これでAuth0側の設定は完了です!
Cognitoの設定(カスタムプロバイダーの追加)
ユーザプールの以下からAuth0の設定を行います。
名前をつけてあげて、SAML IdPメタデータファイルをアップロードするだけです。
最後に属性のマッピングをします。
SAML属性ですが、Auth0だと以下のところのDebug
からアサーションが確認できるので、ここを参考に設定します。
今回はname
をhttp://schemas.auth0.com/username
でマッピングします。
Cognitoの設定(クライアント設定)
最後に、クライアントのIDプロバイダーに先ほど設定したAuth0の設定を追加すれば完了です!
これで、マネージドログイン画面にAuth0も追加されました!
実際に選択してみると、Auth0のログイン画面が表示されます。
動作確認
少し動作確認してみます。
処理シーケンス
Chromeで取得できるネットワークログからシーケンス図を作ってみました。
SAML 2.0とOAuth 2.0/OIDCのハイブリッドフローになっていることがわかると思います。
IDトークン
ID連携して、取得したIDトークンを覗いてみます。
IdPがAuth0であることや、ユーザ名moriyama_saml
が取得できていることがわかります。
{
"at_hash": "fTyFKK1CI_nygSE8h3kN9A",
"sub": "17a4ca28-9041-7078-7042-53c919xxxxxx",
"cognito:groups": [
"ap-northeast-1_xxxxxxxxx_Auth0SAML"
],
"iss": "https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-1_xxxxxxxxx",
"cognito:username": "auth0saml_auth0|6817db56a810172c42865000",
"nonce": "-D0I1sJlzLIMwx4qOnsO3US7yr8Nw1AJj8GC-1VAcam2o9PaJ6IX8yOf3iiEgcxtzKHOyQTNZ6JAliFxqsXrYkMAXVaRyTVQh7s1_YgInOtJEjl5bjV4plCEkO8Q2Qw9KQj54VWLPKc3hzCpnMkoqMyk3G_-7LQ7PVemv-16dm0",
"origin_jti": "b069ac48-330e-451a-a6fa-58b988fdbc88",
"aud": "ar4sjg7u1g1t16cah2rjfkxxx",
"identities": [
{
"dateCreated": "1746393943191",
"userId": "auth0|6817db56a810172c42865000",
"providerName": "Auth0SAML",
"providerType": "SAML",
"issuer": "urn:dev-ryrknqlogokxxxxx.us.auth0.com",
"primary": "true"
}
],
"token_use": "id",
"auth_time": 1746393943,
"name": "moriyama_saml",
"exp": 1746397543,
"iat": 1746393944,
"jti": "f5cc7429-b061-476f-a460-9e3b59774632"
}
最後に
簡単に、ではありますが、2回に分けてID連携を確認できました。
身近な機能ですが、中身の挙動を垣間見ることができてよかったです!