2014-07-20

OpenAMでSSO【OpenID Connect編】

今回は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の設定をクリックして作成

openam-oauth2setting

openam-oauth2-create

で、アクセス制御>対象のレルム>エージェント>OAuth2.0クライアントでエージェントを作成

openam-oauth2-agent

エージェントの名前がClientID、パスワードがClientSecretになります。

openam-oauth2-createagent

作成後に細かい設定ができます。

リダイレクトURI↓

openam-oauth2-redirecturi

スコープ↓

openam-oauth2-scope

デフォルトのスコープ↓

openam-oauth2-defaultscope

 

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

にアクセスしてログインを行うと以下の認可画面が出てきます。

openam-authpage

 

デザインが…とツッコミたい気持ちは抑えて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してみる。

セキュリティのコントロール>認証プロバイダ から新規の認証プロバイダを作成

sfdc-authprovider

内容はこんな感じ

sfdc-openam-authprovideredit

作成するとURLが色々と設定されるので、コールバックURLをOpenAM側でも設定する

sfdc-openam-authprovidedr

openam-sfdc-redirecturi

 

 

これで設定は完了。

あとは既存ユーザをリンクするURLでOpenAMユーザとSFDCユーザのマッピングを行い

シングルサインオン初期化URLを使うなり、私のドメインから認証サービス追加するなりしてSSOできます。

 

SFDCはSAMLサポートしているのでOpenAM利用するんだったらSAMLの方で良いと思いますが

OpenID Connectの方は証明書の交換が必要ないので楽っちゃ楽です。

ただし、SFDCのOIDCはユーザの一括マッピングが厳しそうなので、そう考えるとSAMLになっちゃうんですが。

このエントリーをはてなブックマークに追加