エンタープライズIT環境での 
OpenID Connect / SCIM の 
具体的実装方法 
OpenIDファウンデーション・ジャパン 
Enterprise Identity WG / 技術TF リーダー 
八幡孝(株式会社オージス総研)
OIDF-J EIWGって? 
 OpenIDファウンデーション・ジャパン(OIDF-J) 
 国内におけるOpenID関連技術の普及・啓蒙のための活動を行なっています。 
 Enterprise Identity WG (EIWG) 
 エンタープライズIT市場でOpenID ConnectやSCIMなどの仕様をベースと 
した、IDフェデレーションやIDプロビジョニングの普及を推進し、新たなビ 
ジネスの創造・展開を図ることを目的に活動を行なっています。 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 1
EIWGの昨年度の活動 
 「OpenID ConnectとSCIMのエンタープライズ利 
用ガイドライン」を作成 
 エンタープライズITでのOIDC/SCIMの有用性 
 日本のエンタープライズITへの適用 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 2
EIWGの今年度の活動 
 ビジネスモデルタスクフォース 
 エンタープライズITとクラウドサービスが連携すること 
で、Win-Winとなれる連携モデルの検討 
 技術タスクフォース 
 エンタープライズITとクラウドサービスの連携を進める 
ためのサンプル実装の作成、技術課題の検討 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 3
エンタープライズにおけるID連携の動向 
 オンプレシステム⇒ SaaS活用⇒ BaaS活用 
 エンタープライズIT とクラウドサービスの連携 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 4
エンタープライズにおけるID連携の動向 
 WebアプリのSSO ⇒ APIアクセスのSSO へ拡大 
 エージェント・リバースプロキシによるSSO 
⇒ SAML連携⇒ OpenID Connect 
 CSV配布⇒ 独自I/Fを使ったIDプロビジョニング 
⇒ SCIM 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 5
OpenID Connect / SCIMを使った 
サービス・フェデレーションに向かっている 
オーソリテイティブ・ 
ソース(人事 
システムなど) 
プロビジョニング・ 
システム 
アイデンティティ・ 
リポジトリ/ SSO / 
トークン管理システム 
SaaS 
プロバイダ 
SaaS 
プロバイダ 
Web 
サービス 
Web 
サービス 
ユーザー・ 
エージェント 
(外部サービス) 
ユーザー・ 
エージェント 
(モバイルApp) 
企業 
ユーザー・ 
エージェント 
(Webサービス) 
ユーザー・ 
エージェント 
(デスクトップApp) 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 6 
http://www.slideshare.net/tkudo/saml-and-openid-connect-for-cloud-service-providers 
ユーザー・ 
エージェント 
(Webブラウザ) 
API 
API 
API 
API
エンタープライズITで 
OIDC/SCIMを実装する 
とは、どういうことなのか?
想定するストーリー 
 WebアプリへのSSOをユースケースとして扱う。 
 認証サーバ(OP) を内部ネットワークに配置できる 
ようOIDCではImplicit Flowを使う。 
 WebアプリへアカウントをSCIMを使って事前プロ 
ビジョニングして利用する。 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 8
OIDC/SCIM実装の構成 
OP 
(OIDC) 
IDM 
(SCIM-Cli) 
Webアプリ 
(OIDC-RP) 
(SCIM-Svr) 
 Implicit Flowの利用 
 認証結果の連携 
 ユーザ属性の連携 
Firewall 
 アカウントの事前プロビ 
 不要アカウントのデプロビ 
Webアプリ 
(OIDC-RP) 
(SCIM-Svr) 
エンタープライズIT クラウドサービス 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 9
まずは作ってみた 
 OpenAM でOpenID Connect OP を構成する 
 Ruby OpenID Connect + Rails でOP/RP を作る 
 Java でSCIM Server を作る 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 10
実装例: OpenAMを使ったOPの構成 
 サービス「OAuth2 Provider」を 
追加することでOPを構成 
 サポートするフローのタイプ 
▪ Implicitフロー、認可コードフロー 
 サポートするクレーム 
▪ 例. openid, profile, email, …, etc 
 IDトークンの有効期間 
▪ サポートするIDトークンの署名ア 
ルゴリズム 
▪ 例. HS256, RS256, …, etc 
 IDトークンの署名鍵 
 …, etc 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 11
実装例: OpenAMを使ったOPの構成 
 エージェントの設定で「OAuth 2.0 
クライアント」としてRPを登録 
 クライアントシークレット 
 クライアントタイプ 
▪ Implicitフロー, 認可コードフロー 
 リダイレクトURI 
 サポートするスコープ属性 
▪ 例. openid, profile, email, …, etc 
 サポートするレスポンスタイプ 
▪ 例. code, id_token, …, etc 
 …, etc 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 12
実装例: Rubyを使ったOPの実装 
# -*- coding: utf-8 -*- 
class AuthorizationsController < ApplicationController 
require 'oidc/request' 
require 'oidc/response' 
before_action :authenticate_user! 
def new 
@req = OIDC::Request.new(params) 
if @req.valid? 
render :new 
return 
end 
if (params[:redirect_uri].present? && 
スクラッチで実装 
Application.has_redirect_uri(params[:client_id], params[:redirect_uri])) 
redirect_to @req.error.with_fragment(params[:redirect_uri]) 
else 
render json: @req.error.response 
end 
end 
# 同意画面からPOSTされる先 
def create 
res = OIDC::Response.new(params) 
res.owner = current_user 
redirect_to res.build_response 
end 
end 
tiny-oidc-provider 
├── app 
│ ├── controllers 
│ │ ├── application_controller.rb 
│ │ ├── applications_controller.rb 
│ │ ├── authorizations_controller.rb 
│ │ ├── jwk_controller.rb 
│ │ └── registrations_controller.rb 
│ ├── models 
│ │ ├── application.rb 
│ │ └── user.rb 
│ ├── views 
│ │ └ ... 
│ └ ... 
├── lib 
│ ├── oidc 
│ │ ├── config.rb 
│ │ ├── error_response.rb 
│ │ ├── request.rb 
│ │ └── response.rb 
│ └── oidc.rb 
└ ... 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 
認証状態のチェック 
リクエストパラメータの検証 
同意画面の表示 
パラメータエラーの画面表示 
ID Token, UserInfoなどのレ 
スポンスを生成 
ID Tokenなどをフラグメント 
につけて、redirect_uriへリ 
ダイレクト 
13 
次のページで
実装例: Rubyを使ったOPの実装 
# -*- coding: utf-8 -*- 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 
... 
module OIDC 
class Response 
... 
def initialize(opts) 
@client_id = opts[:client_id] 
@redirect_uri = opts[:redirect_uri] 
@token_type = 'Bearer' 
@state = opts[:state] 
@nonce = opts[:nonce] 
@scope = opts[:scope] 
end 
# Authorization Request に対するResponse を生成します 
# 
# @return [String] ハッシュフラグメントで構成されたパラメータを含むURI 
def build_response 
uri = URI.parse(@redirect_uri) 
uri.fragment=(build_params) 
uri.to_s 
end 
private 
def build_params 
[:token_type, :id_token,:state].inject('') {|str, key| 
str << "#{key}=#{self.send(key)}&" 
}.chop! 
end 
14 
# ID Token(JWT) を生成します 
def id_token 
header = UrlSafeBase64.encode64({ 
:typ => 'JWT', 
:alg => 'RS256', 
}.to_json) 
payload = UrlSafeBase64.encode64(token_data.to_json) 
input = header + '.' + payload 
signature = UrlSafeBase64.encode64(pkey.sign('sha256', input)) 
input + '.' + signature 
end 
def pkey 
OpenSSL::PKey::RSA.new(File.read(OIDC::Config.rsa_private_key)) 
end 
# ID Token のクレームを定義 
def token_data 
issue_at = Time.now.to_i 
exp = issue_at + id_token_expire 
return { 
:iss => issuer, 
:sub => owner.sub, 
:aud => @client_id, 
:exp => exp, 
:iat => issue_at, 
:nonce => @nonce, 
:userinfo => userinfo 
} 
end 
# ownerの情報に対してscopeで指定された情報のみ返却 
def userinfo 
owner.as_json scopes 
end 
end 
end 
スクラッチで実装 
JWTヘッダー 
ID Tokenに含めるクレー 
ムセットを生成 
JWSで署名をつける
実装例: Rubyを使ったRPの実装 
Ruby OpenID Connect を使って 
# -*- coding: utf-8 -*- 
class AuthorizationController < ApplicationController 
def authorize 
redirect_to authz.authorization_uri(new_state, new_nonce) 
end 
def callback 
# @see http://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#FragmentNotes 
end 
def validate 
if params['error'] 
logger.error "error=#{params['error']}, description=#{params['error_description']}" 
render :nothing => true, :status => 400 
return 
end 
unless authz.validate(params, stored_state, stored_nonce) == true 
render :nothing => true, :status => 400 
return 
end 
session[:id_token] = (authz.oidc.id_token).as_json 
session[:user_info] = (authz.oidc.user_info).as_json 
end 
... 
end 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 
15 
oidc-implicit-flow-rp 
├── app 
│ ├── controllers 
│ │ ├── application_controller.rb 
│ │ ├── authorization_controller.rb 
│ │ └── top_controller.rb 
│ ├── models 
│ │ ├── active_model_base.rb 
│ │ ├── authorization.rb 
│ │ ├── concerns 
│ │ └── oidc.rb 
│ └── views 
│ └ ... 
└ ... 
OPの認証エンドポイントへリ 
ダイレクトする 
コールバック先エンドポイント 
フラグメントをPOSTする 
JavaScriptを返す 
フラグメントのPOST先エン 
ドポイント 
ID Tokenを検証し、セッショ 
ンを生成する 
OPがエラーを返した場合の処理 
ID Tokenを検証 
アプリケーションのセッショ 
ンを生成する 
次のページで
実装例: Rubyを使ったRPの実装 
# -*- coding: utf-8 -*- 
require 'base64' 
class Authorization < ActiveModelBase 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 
... 
def authorization_uri(state, nonce) 
client.redirect_uri ||= redirect_uri 
client.authorization_uri( 
response_type: [:id_token].collect(&:to_s), 
state: state, 
nonce: nonce, 
scope: [:openid, :email, :profile].collect(&:to_s) 
) 
end 
def validate(fragment, state, nonce) 
#stateパラメータのチェック 
unless fragment['state'] == state then 
Rails.logger.error 'invalid state parameter.' 
return false 
end 
# ID Tokenの検証 
begin 
id_token = decode_id_token fragment['id_token'] 
id_token.verify!( 
issuer: issuer, 
client_id: identifier, 
nonce: nonce 
) 
oidc.id_token = id_token 
oidc.user_info = id_token.raw_attributes['userinfo'] 
rescue => e 
Rails.logger.error "#{e.message}" 
return false 
end 
return true 
end 
Ruby OpenID Connect を使って 
16 
def oidc 
@oidc||= OIDC.new 
end 
private 
def client 
@client ||= OpenIDConnect::Client.new member_to_json 
end 
def member_to_json 
[:issuer, :identifier, :jwks_uri, 
:authorization_endpoint, 
:token_endpoint, 
:userinfo_endpoint 
].inject({}) do |hash, key| 
hash.merge!( 
key => self.send(key) 
) 
end 
end 
def decode_id_token(id_token) 
OpenIDConnect::ResponseObject::IdToken.decode id_token, public_keys.first 
end 
def jwks 
@jwks ||= JSON.parse(OpenIDConnect.http_client.get_content(jwks_uri)).with_indifferent_access 
JSON::JWK::Set.new @jwks 
end 
#OpenIDConnect::Discovery::Provider::Config::Response 
def public_keys 
@public_keys ||= jwks.collect do |jwk| 
JSON::JWK.decode jwk 
end 
end 
end 
state値の検証も忘れずに 
ID Tokenの検証 
Ruby OpenID Connect 
を使ってID Tokenのデ 
コードと検証 
署名の検証に必要な鍵は 
OPのjwks_uriから入手す 
る 
Ruby OpenID Connect 
を使ってOPの認証エンド 
ポイントへのURLを生成
実装例: Javaを使ったSCIMサーバの実装 
 SCIMのスキーマ毎と 
Bulk操作に対して、エ 
ンドポイントを定義 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 17
実装例: Javaを使ったSCIMサーバの実装 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
// 認証処理 
Operation op = new Operation(); 
boolean result = op.auth( context, request ); 
if ( !result ) { 
// 認証エラー 
errorResponse( response, op.getErrorCode(), op.getErrorMessage() ); 
} else { 
// 検索パラメータ取得 
String targetId = request.getPathInfo(); 
String attributes = request.getParameter( "attributes" ); 
String filter = request.getParameter( "filter" ); 
String sortBy = request.getParameter( "sortBy" ); 
String sortOrder = request.getParameter( "sortOrder" ); 
String startIndex = request.getParameter( "startIndex" ); 
String count = request.getParameter( "count" ); 
// 検索 
JsonObject searchResult = op.search(context, request, targetId, attributes, filter, 
sortBy, sortOrder, startIndex, count ); 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 18 
} 
 各エンドポイントに認証処理 
を実装。Basic認証、OAuth2 
を使った認証など。 
 SCIMの仕様ではOAuth2が推 
奨されている。 
 パラメータ取得。 
 GETの場合はQUERYパラメー 
タから取得。 
 POST, PUT, PATCH操作の場 
合は、リクエストボディで送 
られてくるJSONの取得と解 
析が必要。 
 実際のオブジェクトへの操作 
を実装。 
 バックエンドにDBやLDAPを 
使う設計としてそれらへの操 
作を実装する。
OIDC: 実装簡単。考慮点多い。 
 ライブラリもあるし、製品でも対応。実装は簡単。 
 OP/RPの連携で認証機能を実現。考慮点は多い。 
 エンタープライズIT(OP) とクラウドサービス(RP) 
 OPができること、RPができること 
 OPで対応すべきこと、RPで対応すべきこと 
 相互接続性を保つための取り決め 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 19
SCIM: 実装はやや難。SCIM 2.0対応を視野に。 
 使えるライブラリ、フレームワークが不足。 
 JSON処理以外はほぼスクラッチ 
 SCIM 2.0仕様は、2014年末にリリース予定 
 現在draft の更新が活発 
 SCIM 1.1 -> SCIM 2.0 の変更は多い。 
 実装はSCIM 2.0 への対応をにらんで。 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 20
認証基盤を作るときによく検討されること 
検討事項 
認証された 
ユーザに 
関する情報 
の連携方法 
ID/コード系 
表示情報系 
セッション 
管理 
アイドル 
タイムアウト 
セッション 
タイムアウト 
特定機能利用時の再認証処理 
特定機能利用時の強い認証の 
要求 
従来型の認証基盤 
(一元管理) 
HTTPヘッダで連携する 
 連携されたIDでLDAP問合せ 
 事前にプロビしておく 
 HTTPヘッダで連携する 
認証基盤でタイムアウト処理 
認証基盤でタイムアウト処理 
認証基盤がURLで機能判定し、 
認証画面を表示 
認証基盤がURLで機能判定し、 
追加の認証画面を表示 
フェデレーション型の認証基盤 
(分散協調型の管理) 
トークンで連携 
 トークンで連携 
 ユーザー情報APIから取得 
 事前にプロビしておく 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側からOPへ再認証を要求する 
方法の取り決めが必要。 
RP側からOPへ強度の強い認証を 
要求する方法の取り決めが必要。 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 21
信頼できるクラウドサービスがエンプラITとつながる 
 エンプラ側の視点で 
言えば、多くのこと 
がRPの実装に依存 
した状態。 
 信頼できるRP 
(正しく実装された 
クラウドサービス) 
をエンプラITは求 
めるようになる。 
検討事項 
認証された 
ユーザに 
関する情報 
の連携方法 
ID/コード系 
表示情報系 
セッション 
管理 
アイドル 
タイムアウト 
セッション 
タイムアウト 
特定機能利用時の再認証処理 
特定機能利用時の強い認証の 
要求 
フェデレーション型の認証基盤 
(分散協調型の管理) 
トークンで連携 
 トークンで連携 
 ユーザー情報APIから取得 
 事前にプロビしておく 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側からOPへ再認証を要求する 
方法の取り決めが必要。 
RP側からOPへ強度の強い認証を 
要求する方法の取り決めが必要。 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 22
考慮点についての 
技術TFでの検討内容
技術TFでの検討状況 
検討事項 
認証された 
ユーザに 
関する情報 
の連携方法 
ID/コード系 
表示情報系 
セッション 
管理 
アイドル 
タイムアウト 
セッション 
タイムアウト 
特定機能利用時の再認証処理 
特定機能利用時の強い認証の 
要求 
フェデレーション型の認証基盤 
(分散協調型の管理) 
トークンで連携 
 トークンで連携 
 ユーザー情報APIから取得 
 事前にプロビしておく 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側からOPへ再認証を要求する 
方法の取り決めが必要。 
RP側からOPへ強度の強い認証を 
要求する方法の取り決めが必要。 
利用する属性の共通化 
を検討中 
セッション管理方式の 
共通化を検討中 
今後検討予定 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 24
利用属性の共通化の検討 
検討事項 
認証された 
ユーザに 
関する情報 
の連携方法 
ID/コード系 
表示情報系 
セッション 
管理 
アイドル 
タイムアウト 
セッション 
タイムアウト 
特定機能利用時の再認証処理 
特定機能利用時の強い認証の 
要求 
フェデレーション型の認証基盤 
(分散協調型の管理) 
トークンで連携 
 トークンで連携 
 ユーザー情報APIから取得 
 事前にプロビしておく 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側からOPへ再認証を要求する 
方法の取り決めが必要。 
RP側からOPへ強度の強い認証を 
要求する方法の取り決めが必要。 
利用する属性の共通化 
を検討中 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 25
利用属性の共通化の方針 
 OIDC/SCIMの両方で同じ属性を扱う 
 対応すべき属性を3つのレベルに分類 
利用する属性の共通化 
 RP(クラウドサービス)を動かすための最小限の属性 
 エンタープライズITで通常扱う属性 
 エンタープライズITで必要となりうる属性 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 26
利用する属性を3つのレベルに整理 
レベル1属性(RPを動かすための最小限の属性) 
属性SCIM Schema (*1) OIDC Claims 
ユーザーID externalId, userName sub 
メールアドレ 
ス 
emails email 
– email_verified 
名前name.formatted name 
name.givenName given_name 
name.familyName family_name 
name.middleName middle_name 
更新日lastModified updated_at 
状態Active – 
パスワード使用しない– 
利用する属性の共通化 
レベル2属性(エンタープライズITで通常扱う属性) 
属性SCIM Schema (*1) OIDC Claims 
従業員番号employeeNumber Claimの拡張が必要 
組織コードorgUnitCode(*2) Claimの拡張が必要 
組織名orgUnitLocalNameValue 
(*2) 
Claimの拡張が必要 
役職コードtitleCode(*2) Claimの拡張が必要 
役職名titleLocalNameValue(*2) Claimの拡張が必要 
電話番号phoneNumbers phone_number 
… 
レベル3属性(エンタープライズITで必要となりうる属性) 
属性SCIM Schema (*1) OIDC Claims 
言語locale locale 
表示順displayOrder Claimの拡張が必要 
… 
*1: SCIM2.0 draft-06の項目名で整理 
*2: 「OpenID Connect とSCIM のエンタープライズ利用ガイドライン」 
で定義したOrganizationalUnitリソース、Titleリソースの属性 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 27
OIDCでの連携方法~ scope 
利用する属性の共通化 
 レベル1属性はscope=email profile で要求できる。 
 レベル2、レベル3属性を要求するために拡張scope 
を定義する。 
 それぞれにscope名を定義 
 名称は検討中 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 28
利用する属性の共通化 
OIDCでの連携方法~ IDトークンへの埋め込み 
 IDトークンに 
userinfo claim 
を追加して応答 
{ 
"iss": "http://server.example.com", 
"sub": "248289761001", 
"aud": "s6BhdRkqt3", 
"nonce": "n-0S6_WzA2Mj", 
"exp": 1311281970, 
"iat": 1311280970, 
"userinfo": { 
"name": "日本太郎", 
"given_name": "太郎", 
"family_name": "日本", 
"email": "nippontaro@example.com", 
"orgUnitCode": ["0111", "0211"], 
"orgUnitLocalNameValue": ["営業部", "企画部"], 
"titleCode": "002", 
"titleLocalNameValue": "部長", 
"locale": "ja_JP" 
} 
} 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 29
利用する属性の共通化 
OIDCで使う時に連携か?SCIMで事前プロビか? 
 アプリケーションの特性で使い分ける 
 属性の特性で使い分ける 
 サービス側の使い方で決まることではあるが、クラ 
ウドサービス横断で利用することを前提に共通化を 
検討 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 30
セッション管理方式の共通化の検討 
検討事項 
認証された 
ユーザに 
関する情報 
の連携方法 
ID/コード系 
表示情報系 
セッション 
管理 
アイドル 
タイムアウト 
セッション 
タイムアウト 
特定機能利用時の再認証処理 
特定機能利用時の強い認証の 
要求 
フェデレーション型の認証基盤 
(分散協調型の管理) 
トークンで連携 
 トークンで連携 
 ユーザー情報APIから取得 
 事前にプロビしておく 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側で実装が必要。セッション 
状態の受け渡し方法が課題。 
RP側からOPへ再認証を要求する 
方法の取り決めが必要。 
RP側からOPへ強度の強い認証を 
要求する方法の取り決めが必要。 
セッション管理方式の 
共通化を検討中 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 31
セッション管理方式の検討の必要性 
従来型のSSO フェデレーション型SSO 
 ゲートウェイのように構成され 
た従来のSSO 
 統制(アプリへのアクセス制 
御)観点のセッション管理は 
SSOだけで実装 
セッション管理方式の共通化 
 フェデレーション型では、セッ 
ション管理はRPの実装に依存 
 統制観点のセッション管理のた 
めに、OP-RP間の方式の取り決 
めが必要 
ユーザーSSO アプリユーザー 
OP(SSO) 
RP(アプリ) 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 32
セッション管理方式の検討ポイント 
セッション管理方式の共通化 
 RPがOPにセッションの状態を確認する方法 
 タイムアウト後はアプリ(RP) が利用できないよう 
にするためのOPの振る舞い 
 無効化されたアカウントのセッション停止 
 ユーザーの利用への影響、開発者の対応のしやすさ 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 33
セッション管理方式の選択肢 
セッション管理方式の共通化 
 OpenID Connect Session Management 
 IDトークンの有効期限毎にセッションを更新 
 プロンプト無しで認証フローの再実行 
 リフレッシュトークンを使った認証情報の更新 
 デプロビジョニングによるコントロール 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 
34
セッション管理方式の共通化 
OpenID Connect Session Management 
 OpenID Connect Session 
Management 1.0 - draft 21 
 http://openid.net/specs/openid-connect- 
session-1_0.html 
 セッション確認のリアルタイム性は高い 
 OPへの負荷との調整しだいだが、分単位 
で状態の反映が可能 
 対応のためには全アプリ画面へのiframe 
埋め込みが必要。改修コストは高め。 
ブラウザ 
OP iframe 
client_id + 
session_state 
セッション状態の 
問合せ(非同期) 
changed / 
unchanged 
RP iframe 
OP 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 35
プロンプト無しで認証フローの再実行 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 
ブラウザ 
36 
 IDトークンの有効期限毎にIDトークンを 
取り直すことでセッションを更新する 
 セッション確認の精度は数時間オーダー 
 IDトークンの有効期限が1時間なら、確認精度は1時間 
 対応のためにはアプリのセッション管理 
部分の改修が必要。コールバックを扱う 
処理が必要。対応コストは中くらい。 
 IDトークン再取得をするときにPOST 
データが失われる制限あり。 
セッション管理方式の共通化 
Session 
Manager 
OP 
アプリ 
IDトークンの 
有効期限をチェック 
新しいIDトークンと 
ともに元のURLへ復帰 
prompt=none 
で認証フローを再実行
リフレッシュトークンを使った認証情報の更新 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 
ブラウザ 
37 
 IDトークンの有効期限毎にIDトークンを 
取り直すことでセッションを更新する 
 セッション確認の精度は数時間オーダー 
 IDトークンの有効期限が1時間なら、確認精度は1時間 
 対応のためにはアプリのセッション管理 
部分の改修が必要。対応コストは低め。 
 OPがAuthorization Code Flowに対応す 
る必要あり。DMZへの配置が必須。 
 POSTデータが失われることはない。 
 Offline Clientを使う場合のRefresh 
Token の用法との整合について要検証。 
セッション管理方式の共通化 
Session 
Manager 
OP 
アプリ 
IDトークンの 
有効期限をチェック 
リフレッシュトークンを使って 
新しいIDトークンを取得
セッション管理方式の共通化 
デプロビジョニングによるコントロール 
 セッションタイムアウトには対応できな 
いが、無効化されたアカウントの利用は 
確実に停止する。 
 ID管理によるデプロビジョニングを実行 
することで実現。ID管理が実現されてい 
れば対応コストは不要。 
アプリ 
ユーザー 
テーブル 
無効化されたユーザーの 
継続利用はできなくなる 
ブラウザ 
無効化されたユーザーの 
デプロビジョニング処理 
IDM OP 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 38
セッション管理方式の共通化 
セッション管理方式の共通化の方向性 
方式確認の精度アプリ開発者視点アプリ利用者視点 
OpenID Connect 
Session Management 
○ 
分オーダーでの精度で確認 
可能 
× 
全画面へiframe埋め込みが必要 
△ 
UXは現状のアプリのまま維持 
できる。ブラウザの対応につ 
いては検証が必要 
プロンプト無しで 
認証フローの再実行 
△ 
時間オーダーの精度で確認 
可能 
△ 
セッション管理部の改修。コー 
ルバックを扱う処理が必要 
× 
セッション更新時にPOSTデー 
タが失われる可能性がある 
リフレッシュトークンを 
使った認証情報の更新 
(OPがCodeフローに対応し、DMZ 
に配置される必要あり) 
△ 
時間オーダーの精度で確認 
可能 
○ 
セッション管理部の改修。 
○ 
UXは現状のアプリのまま維持 
できる 
デプロビジョニングによる 
コントロール 
× 
無効化されたアカウントの 
停止にとどまる 
― 
(改修なし) 
○ 
UXは現状のアプリのまま維持 
できる 
目指すところはOIDC Session Management。アプリ対応コストが高いため、過渡的な選択肢は必要。 
いずれの方式も課題はあり、技術TF内で継続検討する。 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 39
今後の活動
今後の活動 
 サンプル実装の継続 
 コードサンプル、製品設定サンプル 
 考慮点の検証、相互接続性の検証 
 エンタープライズ向けOpenID Connect / SCIM 
実装ガイドラインとして文書化 
 年内の公開を目指して活動中 
Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 
41
エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014

エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014

  • 1.
    エンタープライズIT環境での OpenID Connect/ SCIM の 具体的実装方法 OpenIDファウンデーション・ジャパン Enterprise Identity WG / 技術TF リーダー 八幡孝(株式会社オージス総研)
  • 2.
    OIDF-J EIWGって? OpenIDファウンデーション・ジャパン(OIDF-J)  国内におけるOpenID関連技術の普及・啓蒙のための活動を行なっています。  Enterprise Identity WG (EIWG)  エンタープライズIT市場でOpenID ConnectやSCIMなどの仕様をベースと した、IDフェデレーションやIDプロビジョニングの普及を推進し、新たなビ ジネスの創造・展開を図ることを目的に活動を行なっています。 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 1
  • 3.
    EIWGの昨年度の活動  「OpenIDConnectとSCIMのエンタープライズ利 用ガイドライン」を作成  エンタープライズITでのOIDC/SCIMの有用性  日本のエンタープライズITへの適用 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 2
  • 4.
    EIWGの今年度の活動  ビジネスモデルタスクフォース  エンタープライズITとクラウドサービスが連携すること で、Win-Winとなれる連携モデルの検討  技術タスクフォース  エンタープライズITとクラウドサービスの連携を進める ためのサンプル実装の作成、技術課題の検討 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 3
  • 5.
    エンタープライズにおけるID連携の動向  オンプレシステム⇒SaaS活用⇒ BaaS活用  エンタープライズIT とクラウドサービスの連携 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 4
  • 6.
    エンタープライズにおけるID連携の動向  WebアプリのSSO⇒ APIアクセスのSSO へ拡大  エージェント・リバースプロキシによるSSO ⇒ SAML連携⇒ OpenID Connect  CSV配布⇒ 独自I/Fを使ったIDプロビジョニング ⇒ SCIM Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 5
  • 7.
    OpenID Connect /SCIMを使った サービス・フェデレーションに向かっている オーソリテイティブ・ ソース(人事 システムなど) プロビジョニング・ システム アイデンティティ・ リポジトリ/ SSO / トークン管理システム SaaS プロバイダ SaaS プロバイダ Web サービス Web サービス ユーザー・ エージェント (外部サービス) ユーザー・ エージェント (モバイルApp) 企業 ユーザー・ エージェント (Webサービス) ユーザー・ エージェント (デスクトップApp) Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 6 http://www.slideshare.net/tkudo/saml-and-openid-connect-for-cloud-service-providers ユーザー・ エージェント (Webブラウザ) API API API API
  • 8.
  • 9.
    想定するストーリー  WebアプリへのSSOをユースケースとして扱う。  認証サーバ(OP) を内部ネットワークに配置できる ようOIDCではImplicit Flowを使う。  WebアプリへアカウントをSCIMを使って事前プロ ビジョニングして利用する。 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 8
  • 10.
    OIDC/SCIM実装の構成 OP (OIDC) IDM (SCIM-Cli) Webアプリ (OIDC-RP) (SCIM-Svr)  Implicit Flowの利用  認証結果の連携  ユーザ属性の連携 Firewall  アカウントの事前プロビ  不要アカウントのデプロビ Webアプリ (OIDC-RP) (SCIM-Svr) エンタープライズIT クラウドサービス Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 9
  • 11.
    まずは作ってみた  OpenAMでOpenID Connect OP を構成する  Ruby OpenID Connect + Rails でOP/RP を作る  Java でSCIM Server を作る Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 10
  • 12.
    実装例: OpenAMを使ったOPの構成 サービス「OAuth2 Provider」を 追加することでOPを構成  サポートするフローのタイプ ▪ Implicitフロー、認可コードフロー  サポートするクレーム ▪ 例. openid, profile, email, …, etc  IDトークンの有効期間 ▪ サポートするIDトークンの署名ア ルゴリズム ▪ 例. HS256, RS256, …, etc  IDトークンの署名鍵  …, etc Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 11
  • 13.
    実装例: OpenAMを使ったOPの構成 エージェントの設定で「OAuth 2.0 クライアント」としてRPを登録  クライアントシークレット  クライアントタイプ ▪ Implicitフロー, 認可コードフロー  リダイレクトURI  サポートするスコープ属性 ▪ 例. openid, profile, email, …, etc  サポートするレスポンスタイプ ▪ 例. code, id_token, …, etc  …, etc Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 12
  • 14.
    実装例: Rubyを使ったOPの実装 #-*- coding: utf-8 -*- class AuthorizationsController < ApplicationController require 'oidc/request' require 'oidc/response' before_action :authenticate_user! def new @req = OIDC::Request.new(params) if @req.valid? render :new return end if (params[:redirect_uri].present? && スクラッチで実装 Application.has_redirect_uri(params[:client_id], params[:redirect_uri])) redirect_to @req.error.with_fragment(params[:redirect_uri]) else render json: @req.error.response end end # 同意画面からPOSTされる先 def create res = OIDC::Response.new(params) res.owner = current_user redirect_to res.build_response end end tiny-oidc-provider ├── app │ ├── controllers │ │ ├── application_controller.rb │ │ ├── applications_controller.rb │ │ ├── authorizations_controller.rb │ │ ├── jwk_controller.rb │ │ └── registrations_controller.rb │ ├── models │ │ ├── application.rb │ │ └── user.rb │ ├── views │ │ └ ... │ └ ... ├── lib │ ├── oidc │ │ ├── config.rb │ │ ├── error_response.rb │ │ ├── request.rb │ │ └── response.rb │ └── oidc.rb └ ... Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 認証状態のチェック リクエストパラメータの検証 同意画面の表示 パラメータエラーの画面表示 ID Token, UserInfoなどのレ スポンスを生成 ID Tokenなどをフラグメント につけて、redirect_uriへリ ダイレクト 13 次のページで
  • 15.
    実装例: Rubyを使ったOPの実装 #-*- coding: utf-8 -*- Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. ... module OIDC class Response ... def initialize(opts) @client_id = opts[:client_id] @redirect_uri = opts[:redirect_uri] @token_type = 'Bearer' @state = opts[:state] @nonce = opts[:nonce] @scope = opts[:scope] end # Authorization Request に対するResponse を生成します # # @return [String] ハッシュフラグメントで構成されたパラメータを含むURI def build_response uri = URI.parse(@redirect_uri) uri.fragment=(build_params) uri.to_s end private def build_params [:token_type, :id_token,:state].inject('') {|str, key| str << "#{key}=#{self.send(key)}&" }.chop! end 14 # ID Token(JWT) を生成します def id_token header = UrlSafeBase64.encode64({ :typ => 'JWT', :alg => 'RS256', }.to_json) payload = UrlSafeBase64.encode64(token_data.to_json) input = header + '.' + payload signature = UrlSafeBase64.encode64(pkey.sign('sha256', input)) input + '.' + signature end def pkey OpenSSL::PKey::RSA.new(File.read(OIDC::Config.rsa_private_key)) end # ID Token のクレームを定義 def token_data issue_at = Time.now.to_i exp = issue_at + id_token_expire return { :iss => issuer, :sub => owner.sub, :aud => @client_id, :exp => exp, :iat => issue_at, :nonce => @nonce, :userinfo => userinfo } end # ownerの情報に対してscopeで指定された情報のみ返却 def userinfo owner.as_json scopes end end end スクラッチで実装 JWTヘッダー ID Tokenに含めるクレー ムセットを生成 JWSで署名をつける
  • 16.
    実装例: Rubyを使ったRPの実装 RubyOpenID Connect を使って # -*- coding: utf-8 -*- class AuthorizationController < ApplicationController def authorize redirect_to authz.authorization_uri(new_state, new_nonce) end def callback # @see http://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html#FragmentNotes end def validate if params['error'] logger.error "error=#{params['error']}, description=#{params['error_description']}" render :nothing => true, :status => 400 return end unless authz.validate(params, stored_state, stored_nonce) == true render :nothing => true, :status => 400 return end session[:id_token] = (authz.oidc.id_token).as_json session[:user_info] = (authz.oidc.user_info).as_json end ... end Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 15 oidc-implicit-flow-rp ├── app │ ├── controllers │ │ ├── application_controller.rb │ │ ├── authorization_controller.rb │ │ └── top_controller.rb │ ├── models │ │ ├── active_model_base.rb │ │ ├── authorization.rb │ │ ├── concerns │ │ └── oidc.rb │ └── views │ └ ... └ ... OPの認証エンドポイントへリ ダイレクトする コールバック先エンドポイント フラグメントをPOSTする JavaScriptを返す フラグメントのPOST先エン ドポイント ID Tokenを検証し、セッショ ンを生成する OPがエラーを返した場合の処理 ID Tokenを検証 アプリケーションのセッショ ンを生成する 次のページで
  • 17.
    実装例: Rubyを使ったRPの実装 #-*- coding: utf-8 -*- require 'base64' class Authorization < ActiveModelBase Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. ... def authorization_uri(state, nonce) client.redirect_uri ||= redirect_uri client.authorization_uri( response_type: [:id_token].collect(&:to_s), state: state, nonce: nonce, scope: [:openid, :email, :profile].collect(&:to_s) ) end def validate(fragment, state, nonce) #stateパラメータのチェック unless fragment['state'] == state then Rails.logger.error 'invalid state parameter.' return false end # ID Tokenの検証 begin id_token = decode_id_token fragment['id_token'] id_token.verify!( issuer: issuer, client_id: identifier, nonce: nonce ) oidc.id_token = id_token oidc.user_info = id_token.raw_attributes['userinfo'] rescue => e Rails.logger.error "#{e.message}" return false end return true end Ruby OpenID Connect を使って 16 def oidc @oidc||= OIDC.new end private def client @client ||= OpenIDConnect::Client.new member_to_json end def member_to_json [:issuer, :identifier, :jwks_uri, :authorization_endpoint, :token_endpoint, :userinfo_endpoint ].inject({}) do |hash, key| hash.merge!( key => self.send(key) ) end end def decode_id_token(id_token) OpenIDConnect::ResponseObject::IdToken.decode id_token, public_keys.first end def jwks @jwks ||= JSON.parse(OpenIDConnect.http_client.get_content(jwks_uri)).with_indifferent_access JSON::JWK::Set.new @jwks end #OpenIDConnect::Discovery::Provider::Config::Response def public_keys @public_keys ||= jwks.collect do |jwk| JSON::JWK.decode jwk end end end state値の検証も忘れずに ID Tokenの検証 Ruby OpenID Connect を使ってID Tokenのデ コードと検証 署名の検証に必要な鍵は OPのjwks_uriから入手す る Ruby OpenID Connect を使ってOPの認証エンド ポイントへのURLを生成
  • 18.
    実装例: Javaを使ったSCIMサーバの実装 SCIMのスキーマ毎と Bulk操作に対して、エ ンドポイントを定義 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 17
  • 19.
    実装例: Javaを使ったSCIMサーバの実装 protectedvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 認証処理 Operation op = new Operation(); boolean result = op.auth( context, request ); if ( !result ) { // 認証エラー errorResponse( response, op.getErrorCode(), op.getErrorMessage() ); } else { // 検索パラメータ取得 String targetId = request.getPathInfo(); String attributes = request.getParameter( "attributes" ); String filter = request.getParameter( "filter" ); String sortBy = request.getParameter( "sortBy" ); String sortOrder = request.getParameter( "sortOrder" ); String startIndex = request.getParameter( "startIndex" ); String count = request.getParameter( "count" ); // 検索 JsonObject searchResult = op.search(context, request, targetId, attributes, filter, sortBy, sortOrder, startIndex, count ); Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 18 }  各エンドポイントに認証処理 を実装。Basic認証、OAuth2 を使った認証など。  SCIMの仕様ではOAuth2が推 奨されている。  パラメータ取得。  GETの場合はQUERYパラメー タから取得。  POST, PUT, PATCH操作の場 合は、リクエストボディで送 られてくるJSONの取得と解 析が必要。  実際のオブジェクトへの操作 を実装。  バックエンドにDBやLDAPを 使う設計としてそれらへの操 作を実装する。
  • 20.
    OIDC: 実装簡単。考慮点多い。 ライブラリもあるし、製品でも対応。実装は簡単。  OP/RPの連携で認証機能を実現。考慮点は多い。  エンタープライズIT(OP) とクラウドサービス(RP)  OPができること、RPができること  OPで対応すべきこと、RPで対応すべきこと  相互接続性を保つための取り決め Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 19
  • 21.
    SCIM: 実装はやや難。SCIM 2.0対応を視野に。  使えるライブラリ、フレームワークが不足。  JSON処理以外はほぼスクラッチ  SCIM 2.0仕様は、2014年末にリリース予定  現在draft の更新が活発  SCIM 1.1 -> SCIM 2.0 の変更は多い。  実装はSCIM 2.0 への対応をにらんで。 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 20
  • 22.
    認証基盤を作るときによく検討されること 検討事項 認証された ユーザに 関する情報 の連携方法 ID/コード系 表示情報系 セッション 管理 アイドル タイムアウト セッション タイムアウト 特定機能利用時の再認証処理 特定機能利用時の強い認証の 要求 従来型の認証基盤 (一元管理) HTTPヘッダで連携する  連携されたIDでLDAP問合せ  事前にプロビしておく  HTTPヘッダで連携する 認証基盤でタイムアウト処理 認証基盤でタイムアウト処理 認証基盤がURLで機能判定し、 認証画面を表示 認証基盤がURLで機能判定し、 追加の認証画面を表示 フェデレーション型の認証基盤 (分散協調型の管理) トークンで連携  トークンで連携  ユーザー情報APIから取得  事前にプロビしておく RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側からOPへ再認証を要求する 方法の取り決めが必要。 RP側からOPへ強度の強い認証を 要求する方法の取り決めが必要。 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 21
  • 23.
    信頼できるクラウドサービスがエンプラITとつながる  エンプラ側の視点で 言えば、多くのこと がRPの実装に依存 した状態。  信頼できるRP (正しく実装された クラウドサービス) をエンプラITは求 めるようになる。 検討事項 認証された ユーザに 関する情報 の連携方法 ID/コード系 表示情報系 セッション 管理 アイドル タイムアウト セッション タイムアウト 特定機能利用時の再認証処理 特定機能利用時の強い認証の 要求 フェデレーション型の認証基盤 (分散協調型の管理) トークンで連携  トークンで連携  ユーザー情報APIから取得  事前にプロビしておく RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側からOPへ再認証を要求する 方法の取り決めが必要。 RP側からOPへ強度の強い認証を 要求する方法の取り決めが必要。 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 22
  • 24.
  • 25.
    技術TFでの検討状況 検討事項 認証された ユーザに 関する情報 の連携方法 ID/コード系 表示情報系 セッション 管理 アイドル タイムアウト セッション タイムアウト 特定機能利用時の再認証処理 特定機能利用時の強い認証の 要求 フェデレーション型の認証基盤 (分散協調型の管理) トークンで連携  トークンで連携  ユーザー情報APIから取得  事前にプロビしておく RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側からOPへ再認証を要求する 方法の取り決めが必要。 RP側からOPへ強度の強い認証を 要求する方法の取り決めが必要。 利用する属性の共通化 を検討中 セッション管理方式の 共通化を検討中 今後検討予定 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 24
  • 26.
    利用属性の共通化の検討 検討事項 認証された ユーザに 関する情報 の連携方法 ID/コード系 表示情報系 セッション 管理 アイドル タイムアウト セッション タイムアウト 特定機能利用時の再認証処理 特定機能利用時の強い認証の 要求 フェデレーション型の認証基盤 (分散協調型の管理) トークンで連携  トークンで連携  ユーザー情報APIから取得  事前にプロビしておく RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側からOPへ再認証を要求する 方法の取り決めが必要。 RP側からOPへ強度の強い認証を 要求する方法の取り決めが必要。 利用する属性の共通化 を検討中 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 25
  • 27.
    利用属性の共通化の方針  OIDC/SCIMの両方で同じ属性を扱う  対応すべき属性を3つのレベルに分類 利用する属性の共通化  RP(クラウドサービス)を動かすための最小限の属性  エンタープライズITで通常扱う属性  エンタープライズITで必要となりうる属性 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 26
  • 28.
    利用する属性を3つのレベルに整理 レベル1属性(RPを動かすための最小限の属性) 属性SCIMSchema (*1) OIDC Claims ユーザーID externalId, userName sub メールアドレ ス emails email – email_verified 名前name.formatted name name.givenName given_name name.familyName family_name name.middleName middle_name 更新日lastModified updated_at 状態Active – パスワード使用しない– 利用する属性の共通化 レベル2属性(エンタープライズITで通常扱う属性) 属性SCIM Schema (*1) OIDC Claims 従業員番号employeeNumber Claimの拡張が必要 組織コードorgUnitCode(*2) Claimの拡張が必要 組織名orgUnitLocalNameValue (*2) Claimの拡張が必要 役職コードtitleCode(*2) Claimの拡張が必要 役職名titleLocalNameValue(*2) Claimの拡張が必要 電話番号phoneNumbers phone_number … レベル3属性(エンタープライズITで必要となりうる属性) 属性SCIM Schema (*1) OIDC Claims 言語locale locale 表示順displayOrder Claimの拡張が必要 … *1: SCIM2.0 draft-06の項目名で整理 *2: 「OpenID Connect とSCIM のエンタープライズ利用ガイドライン」 で定義したOrganizationalUnitリソース、Titleリソースの属性 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 27
  • 29.
    OIDCでの連携方法~ scope 利用する属性の共通化  レベル1属性はscope=email profile で要求できる。  レベル2、レベル3属性を要求するために拡張scope を定義する。  それぞれにscope名を定義  名称は検討中 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 28
  • 30.
    利用する属性の共通化 OIDCでの連携方法~ IDトークンへの埋め込み  IDトークンに userinfo claim を追加して応答 { "iss": "http://server.example.com", "sub": "248289761001", "aud": "s6BhdRkqt3", "nonce": "n-0S6_WzA2Mj", "exp": 1311281970, "iat": 1311280970, "userinfo": { "name": "日本太郎", "given_name": "太郎", "family_name": "日本", "email": "nippontaro@example.com", "orgUnitCode": ["0111", "0211"], "orgUnitLocalNameValue": ["営業部", "企画部"], "titleCode": "002", "titleLocalNameValue": "部長", "locale": "ja_JP" } } Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 29
  • 31.
    利用する属性の共通化 OIDCで使う時に連携か?SCIMで事前プロビか? アプリケーションの特性で使い分ける  属性の特性で使い分ける  サービス側の使い方で決まることではあるが、クラ ウドサービス横断で利用することを前提に共通化を 検討 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 30
  • 32.
    セッション管理方式の共通化の検討 検討事項 認証された ユーザに 関する情報 の連携方法 ID/コード系 表示情報系 セッション 管理 アイドル タイムアウト セッション タイムアウト 特定機能利用時の再認証処理 特定機能利用時の強い認証の 要求 フェデレーション型の認証基盤 (分散協調型の管理) トークンで連携  トークンで連携  ユーザー情報APIから取得  事前にプロビしておく RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側で実装が必要。セッション 状態の受け渡し方法が課題。 RP側からOPへ再認証を要求する 方法の取り決めが必要。 RP側からOPへ強度の強い認証を 要求する方法の取り決めが必要。 セッション管理方式の 共通化を検討中 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 31
  • 33.
    セッション管理方式の検討の必要性 従来型のSSO フェデレーション型SSO  ゲートウェイのように構成され た従来のSSO  統制(アプリへのアクセス制 御)観点のセッション管理は SSOだけで実装 セッション管理方式の共通化  フェデレーション型では、セッ ション管理はRPの実装に依存  統制観点のセッション管理のた めに、OP-RP間の方式の取り決 めが必要 ユーザーSSO アプリユーザー OP(SSO) RP(アプリ) Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 32
  • 34.
    セッション管理方式の検討ポイント セッション管理方式の共通化 RPがOPにセッションの状態を確認する方法  タイムアウト後はアプリ(RP) が利用できないよう にするためのOPの振る舞い  無効化されたアカウントのセッション停止  ユーザーの利用への影響、開発者の対応のしやすさ Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 33
  • 35.
    セッション管理方式の選択肢 セッション管理方式の共通化 OpenID Connect Session Management  IDトークンの有効期限毎にセッションを更新  プロンプト無しで認証フローの再実行  リフレッシュトークンを使った認証情報の更新  デプロビジョニングによるコントロール Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 34
  • 36.
    セッション管理方式の共通化 OpenID ConnectSession Management  OpenID Connect Session Management 1.0 - draft 21  http://openid.net/specs/openid-connect- session-1_0.html  セッション確認のリアルタイム性は高い  OPへの負荷との調整しだいだが、分単位 で状態の反映が可能  対応のためには全アプリ画面へのiframe 埋め込みが必要。改修コストは高め。 ブラウザ OP iframe client_id + session_state セッション状態の 問合せ(非同期) changed / unchanged RP iframe OP Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 35
  • 37.
    プロンプト無しで認証フローの再実行 Copyright ©2014 OpenID Foundation Japan. All Rights Reserved. ブラウザ 36  IDトークンの有効期限毎にIDトークンを 取り直すことでセッションを更新する  セッション確認の精度は数時間オーダー  IDトークンの有効期限が1時間なら、確認精度は1時間  対応のためにはアプリのセッション管理 部分の改修が必要。コールバックを扱う 処理が必要。対応コストは中くらい。  IDトークン再取得をするときにPOST データが失われる制限あり。 セッション管理方式の共通化 Session Manager OP アプリ IDトークンの 有効期限をチェック 新しいIDトークンと ともに元のURLへ復帰 prompt=none で認証フローを再実行
  • 38.
    リフレッシュトークンを使った認証情報の更新 Copyright ©2014 OpenID Foundation Japan. All Rights Reserved. ブラウザ 37  IDトークンの有効期限毎にIDトークンを 取り直すことでセッションを更新する  セッション確認の精度は数時間オーダー  IDトークンの有効期限が1時間なら、確認精度は1時間  対応のためにはアプリのセッション管理 部分の改修が必要。対応コストは低め。  OPがAuthorization Code Flowに対応す る必要あり。DMZへの配置が必須。  POSTデータが失われることはない。  Offline Clientを使う場合のRefresh Token の用法との整合について要検証。 セッション管理方式の共通化 Session Manager OP アプリ IDトークンの 有効期限をチェック リフレッシュトークンを使って 新しいIDトークンを取得
  • 39.
    セッション管理方式の共通化 デプロビジョニングによるコントロール セッションタイムアウトには対応できな いが、無効化されたアカウントの利用は 確実に停止する。  ID管理によるデプロビジョニングを実行 することで実現。ID管理が実現されてい れば対応コストは不要。 アプリ ユーザー テーブル 無効化されたユーザーの 継続利用はできなくなる ブラウザ 無効化されたユーザーの デプロビジョニング処理 IDM OP Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 38
  • 40.
    セッション管理方式の共通化 セッション管理方式の共通化の方向性 方式確認の精度アプリ開発者視点アプリ利用者視点 OpenID Connect Session Management ○ 分オーダーでの精度で確認 可能 × 全画面へiframe埋め込みが必要 △ UXは現状のアプリのまま維持 できる。ブラウザの対応につ いては検証が必要 プロンプト無しで 認証フローの再実行 △ 時間オーダーの精度で確認 可能 △ セッション管理部の改修。コー ルバックを扱う処理が必要 × セッション更新時にPOSTデー タが失われる可能性がある リフレッシュトークンを 使った認証情報の更新 (OPがCodeフローに対応し、DMZ に配置される必要あり) △ 時間オーダーの精度で確認 可能 ○ セッション管理部の改修。 ○ UXは現状のアプリのまま維持 できる デプロビジョニングによる コントロール × 無効化されたアカウントの 停止にとどまる ― (改修なし) ○ UXは現状のアプリのまま維持 できる 目指すところはOIDC Session Management。アプリ対応コストが高いため、過渡的な選択肢は必要。 いずれの方式も課題はあり、技術TF内で継続検討する。 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 39
  • 41.
  • 42.
    今後の活動  サンプル実装の継続  コードサンプル、製品設定サンプル  考慮点の検証、相互接続性の検証  エンタープライズ向けOpenID Connect / SCIM 実装ガイドラインとして文書化  年内の公開を目指して活動中 Copyright © 2014 OpenID Foundation Japan. All Rights Reserved. 41