今回は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"
}
{OpenAMのURL(ex. http://openam.example.com:8080/openam)}/oauth2/authorize?response_type=code&client_id={設定したエージェント名}&redirect_uri={設定したリダイレクトURI}&scope=profile%20openid
にアクセスしてログインを行うと以下の認可画面が出てきます。
デザインが…とツッコミたい気持ちは抑えて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になっちゃうんですが。











