今回はOpenAMを使ってOpenID ConnectでSSOを実現したいと思います。
この方法だとPolicy Agentと同様にWebアプリの改修が必要になりますが
OpenID Connect準拠なのでセキュリティ等が担保されているのが利点です。
以下、参考URLになります。
最新のOpenAMを導入してOpenID Connect ServerとClientを実装する(IdP編)
OSSによるアイデンティティ管理(4):OpenAMのOpenID Connectへの対応 (3⁄3) - @IT
Chapter 3. Using RESTful Web Services
Chapter 6. Configuring Policy Agent Profiles
Chapter 12. Managing OAuth 2.0 Authorization
SFDCにはOpenID ConnectのRP側の機能もあるので、SFDCとOpenAMをOpenID ConnectでSSOしてみます。
1. OpenAM側の設定
基本的に参考URL通りにやっておけばOKでトップページからOAuth2の設定をクリックして作成
で、アクセス制御>対象のレルム>エージェント>OAuth2.0クライアントでエージェントを作成
エージェントの名前がClientID、パスワードがClientSecretになります。
作成後に細かい設定ができます。
リダイレクトURI↓
スコープ↓
デフォルトのスコープ↓
2. 簡単な動作確認
OpenAMのOAuthサーバの各エンドポイントは以下のURLにアクセスして取得します。{OpenAMのURL}/.well-known/openid-configuration
{
"response_types_supported": [
"token id_token",
"code token",
"code token id_token",
"token",
"code id_token",
"code",
"id_token"
],
"registration_endpoint": "http://*****.com:8080/openam/oauth2/connect/register",
"token_endpoint": "http://*****.com:8080/openam/oauth2/access_token",
"end_session_endpoint": "http://*****.com:8080/openam/oauth2/connect/endSession",
"version": "3.0",
"userinfo_endpoint": "http://*****.com:8080/openam/oauth2/userinfo",
"subject_types_supported": [
"public"
],
"issuer": "http://*****.com:8080/openam",
"jwks_uri": "",
"id_token_signing_alg_values_supported": [
"HS256",
"HS512",
"HS384"
],
"check_session_iframe": "http://*****.com:8080/openam/oauth2/connect/checkSession",
"claims_supported": [
"phone",
"email",
"address",
"openid",
"profile"
],
"authorization_endpoint": "http://*****.com:8080/openam/oauth2/authorize"
}
にアクセスしてログインを行うと以下の認可画面が出てきます。
デザインが…とツッコミたい気持ちは抑えてAllowを押します。
そうすると指定したredirect_uriにcodeが返ってくるので
tokenエンドポイントの{OpenAMのURL}/oauth2/access_token に対して
client_id={設定したエージェント名}&code={取得したCode値}&grant_type=authorization_code&client_secret={設定したパスワード}&redirect_uri={設定したリダイレクトURI}
をPOSTします。
レスポンスはこんな感じ。
{
"scope": "openid profile",
"expires_in": 59,
"token_type": "Bearer",
"refresh_token": "6961b8e2-a254-4c53-adb9-5bc8accb87e0",
"id_token": "eyAiY**********.eyAi**********.hQI1m2x2EqA4JbQmxpnUDp8exvkUnaC2xZOseLR2oD4",
"access_token": "a3e212d3-0519-4230-af71-cf270a8b33dd"
}
id_tokenはデコードするとこんな感じ。
{
"tokenName": "id_token",
"exp": 1405839656,
"azp": "OIDC",
"sub": "*****",
"tokenType": "JWTToken",
"realm": "/",
"aud": [
"OIDC"
],
"iss": "http://*****.com:8080/openam",
"iat": 1405839056,
"ath": 1405839056
}
3. Salesforceに対してSSOしてみる。
セキュリティのコントロール>認証プロバイダ から新規の認証プロバイダを作成内容はこんな感じ
作成するとURLが色々と設定されるので、コールバックURLをOpenAM側でも設定する
これで設定は完了。
あとは既存ユーザをリンクするURLでOpenAMユーザとSFDCユーザのマッピングを行い
シングルサインオン初期化URLを使うなり、私のドメインから認証サービス追加するなりしてSSOできます。
SFDCはSAMLサポートしているのでOpenAM利用するんだったらSAMLの方で良いと思いますが
OpenID Connectの方は証明書の交換が必要ないので楽っちゃ楽です。
ただし、SFDCのOIDCはユーザの一括マッピングが厳しそうなので、そう考えるとSAMLになっちゃうんですが。