以下、本発明を実施するための最良の形態について図面を用いて説明する。尚、後述の認可サーバー200と認可サーバー201のどちらでもよい場合は「認可サーバー200、201」と記載し、リソースサーバー300とリソースサーバー301のどちらでもよい場合も「リソースサーバー300、301」と記載する。また、認可サーバー201が認可トークンを発行する場合は、認可サーバー201で発行された認可トークンを用いてリソースサーバー301の公開するAPIがアクセスされるものとする。認可サーバー200とリソースサーバー300の関係についても同様である。
[実施例1]
図1を用いて、本発明の実施形態に係る情報処理システムについて説明する。情報処理システムは、図1に示すようなネットワーク構成で実現される。WAN(Wide Area Network)100はWWW(World Wide Web)システムによって構築されている。WAN100と各種デバイス200~500はLAN(LocalArea Network)101を介して接続されている。
認可サーバー200、201はOAuth 2.0を実現するためのサーバーであり、認証要求の受信、管理等の処理を行う。図1では、認可サーバー200とリソースサーバー300、認可サーバー201とリソースサーバー301がLAN101で接続されている形態を示しているが、WAN100を介して接続される構成も可能である。
認可サーバー200、201はLAN101を介して不図示のデータベースサーバーと接続されている。認可サーバー200、201が自身の機能を実現する際に用いるデータは、そのデータベースサーバーに格納されている形態でもよい。本実施例では認可サーバー200とリソースサーバー300、認可サーバー201とリソースサーバー301をそれぞれ別のサーバーであるものとして説明しているが、各種サーバーの物理的構成は問わない。例えば、同一のサーバー上に両サーバーの機能が構成されている形態でもよく、複数のサーバーで一つの認可サーバー、あるいはリソースサーバーの機能を実現する形態でもよい。
リソースサーバー300と認可サーバー200(あるいはリソースサーバー301と認可サーバー201)との所在の形態は、同じリージョン内、あるいは同じシステム内である形態に限定されない。認可サーバー200で発行された認可トークンをリソースサーバー300が問い合わせることができれば、所在の形態は問わない。あるいは、リソースサーバー300が、認可トークンとともに受信した署名情報を検証する形態等でもよい。
クライアント400としては、例えばプリンターやMFP、もしくはPCやスマートフォン等が挙げられる。端末500はWebブラウザー510を有し、一例としてはPCやスマートフォン等が挙げられる。ユーザーはWebブラウザー510を介して認可サーバー200、201に対するユーザーの認証要求やクライアント400に対するログイン操作等、各種デバイスの機能を利用することができる。
クライアント400もWebブラウザー410を備える。ユーザーはWebブラウザー410またはWebブラウザー510を操作して後述の認可操作を実行する。クライアント400と端末500はLAN101を介して接続されている。以降、Webブラウザー410とWebブラウザー510のどちらで実行するかを問わない場合は、「Webブラウザー410、510」と称する。
なお、本実施例では、クライアント400および端末500と認可サーバー200とリソースサーバー300がリージョン「jp」に所在し、認可サーバー201とリソースサーバー301がリージョン「eu」に所在するものとする。本実施例におけるリージョンとは、個人情報保護、安全保障等の観点から域外へのユーザー情報の移動に関して情報技術的、法的などの何らかの制限が存在する地域を示す。
次に図2を用いて、認可サーバー200、201、リソースサーバー300、301およびクライアント400、端末500のハードウェア構成を説明する。なお、図2は一般的な情報処理装置のブロック図であり、本実施形態の各種デバイスには一般的な情報処理装置のハードウェア構成やIaaS(Infrastructure as a Service)として提供される情報処理装置の仮想的なハードウェア構成を適用できる。図2では、クライアント400を例に説明するが、リソースサーバー300、301や認可サーバー200、201、端末500も同様のハードウェア構成を有するものとする。
CPU2001は、RAM2002、ROM2003、外部メモリ2011などからプログラムを取り出してプログラムの命令を実行し、クライアント400の制御を行うユニットである。後述のシーケンスはこのプログラムの命令が実行されることにより実現される。また、CPU2001はシステムバス2004に接続される各ブロックを制御する。
RAM2002は、CPU2001が命令を実行する際に使用するワークメモリである。ROM2003や外部メモリ2011に保存されたOSやアプリケーション等のプログラムがRAM2002へとロードされ、そのプログラムの命令をCPU2001が順次読みだすことで命令を実行する。ROM2003は、アプリケーションプログラムおよびOSを含む組込済みプログラム、およびデータ等が記録されている記憶装置である。
KBC(キーボードコントローラ)2005は、KB(キーボード)2009や不図示のポインティングデバイスからの入力を制御するユニットである。CRTC(Cathode Ray Tube Controller)2006は、CRTディスプレイ2010の表示を制御するユニットである。DKC(Disk Controller)2007は外部メモリ2011に対するデータアクセスを制御するユニットである。NC(ネットワークコントローラ)2008はWAN100やLAN101を介して接続された他のデバイスとの通信制御処理を実行する。なお、IaaSとして提供される仮想的な情報処理装置の場合は、KBC2005やCRTC2006等を備えず、NC2008を介して接続される端末が備えるキーボードやCRTディスプレイから操作されるよう構成される。
尚、後述の説明においては、特に断りのない限り、各種デバイスの機能が実行される際のハードウェアの主体はCPU2001であり、ソフトウェアの主体はRAM2002、ROM2003、外部メモリ2011等にインストールされたプログラムであるものとする。
次に図3を用いて、認可サーバー200、201、リソースサーバー300、301、クライアント400、端末500が有する機能について説明する。認可サーバー201は認可サーバー200と、リソースサーバー300はリソースサーバー301と同様の機能を有するため、図3の説明ではクライアント400の説明に加えて、認可サーバー200とリソースサーバー300を例に説明する。
認可サーバー200は、認可サーバー部210とHTTPサーバー部220を有する。HTTPサーバー部220はWAN100を介してクライアント400と端末500に接続されており、Webブラウザー410、510や後述のアプリケーション420とHTTP通信を行う機能である。また、HTTPサーバー部220はSSL/TLSによる通信が可能であり、不図示の証明書ストアを有する。
認可サーバー部210はHTTPサーバー部220を介してWebブラウザー410、510からの要求を受信し、受信した要求に対する結果を応答する機能である。具体的には、ユーザー認証の要求をHTTPサーバー部220がWebブラウザー410、510から受信し、認証が成功したユーザー情報に紐づいた認証トークンを生成する。生成された認証トークンはWebブラウザー410、510に通知される。認証トークンとは、ユーザーが認可サーバー200にログインしている事を示すためのトークン、またはユーザーが認可サーバー200において認証されているかを検証するためのトークンである。認証トークンを用いることで認可サーバー200はユーザーを識別することが可能となる。また、認可サーバー部210は、認可トークンに署名情報を付与するための秘密鍵を保持するように構成する事もできる。その場合は、この秘密鍵を用いて認可トークンに署名情報を付与し、署名情報付きの認可トークンをクライアント400に対して発行する。
リソースサーバー300はリソースサーバー部310を有する。リソースサーバー部310は、Webサービスを提供するためのAPIを公開する機能である。なお、認可サーバー200と同様に、HTTPサーバー部を備え、HTTPサーバー部を介して外部との受送信を実行する形態でもよい。
クライアント400はWebブラウザー410とアプリケーション420と認証部430とトークンプロバイダー440を有する。Webブラウザー410はWWWを利用するためのユーザーエージェントによって実現される機能である。Webブラウザー410はユーザーの操作により、認可サーバー200およびトークンプロバイダー440と通信を行う。端末500が備えるWebブラウザー510もWebブラウザー410と同様の機能である。アプリケーション420は、トークンプロバイダー440を介して認可サーバー200から認可トークンを取得する機能である。取得した認可トークンを用いて、アプリケーション420はリソースサーバー300が公開するAPIを利用できる。
トークンプロバイダー440は、アプリケーション420からの認可トークン要求を受信し、認可サーバー200と通信を行う事で認可トークンを取得する。ユーザーはWebブラウザー410、510を用いて認可サーバー200およびトークンプロバイダー440と通信を行う事で認可操作を行う。
ここで、認可トークン要求は、アプリケーション420が認可トークンを取得するためにトークンプロバイダー440に対して送信するリクエストである。一方のトークン要求は、トークンプロバイダー440が認可トークンを取得するために認可サーバー200、201に対して送信するリクエストである。このように、同じ認可トークンを取得するリクエストであっても、リクエストの受信元と送信先とが異なることでリクエストの呼称を変えていることに留意されたい。
トークンプロバイダー440はベンダーデフォルトクレデンシャルとして、トークンプロバイダー440自身を証明するためにX.509形式で定められるクライアント証明書およびその秘密鍵を備える。そして、トークンプロバイダーがクライアント証明書およびその秘密鍵を、認可サーバー200との通信を確立する際に利用する事で、認可サーバー200はトークンプロバイダーを認証することができる。
認証部430はユーザーを認証するための機能である。ユーザーはクライアント400の機能を利用するために、クライアント400における不図示の入力画面においてローカルユーザーIDとローカルユーザーパスワードを入力する。入力情報を受信したクライアント400は、認証部430において予め登録されている情報(ローカルユーザーIDとローカルユーザーパスワード)と入力された情報とを照合することでユーザーの認証処理を行い、ログインコンテキストを生成する。なお認証処理の形態はこれに留まらず、例えば、ICカードを使った認証や指紋等の生体認証でもよい。
ここでログインコンテキストは、クライアント400でローカルユーザーを識別するための情報であり、例えば、ローカルユーザーIDから構成される。ログインコンテキストは、クライアント400にローカルユーザーがログインした際にクライアント400のOS(不図示)において生成され、ログオフした際に消去される。ローカルユーザーのログイン操作でログインコンテキストが生成されることにより、ログイン中のローカルユーザーがアクセス権限を有するWebページがWebブラウザー410上に公開される。ローカルユーザーのログオフ操作でログインコンテキストが消去されることにより、ローカルユーザーがアクセス権限を有するWebページを別のユーザーに公開することなく、セキュリティを担保することができる。認証部430で生成されたログインコンテキストはアプリケーション420と認証部430とトークンプロバイダー440で共有される。
本実施例では、ユーザーが直接クライアント400を操作してログインする形態で説明するが、Webブラウザー510を介してリモートでログインする形態でもよい。その場合、認証部430は不図示のログイン画面をWebブラウザー510に応答する。ユーザーはそのログイン画面にローカルユーザーIDとローカルユーザーパスワードを入力することでユーザー情報は認証される。
図4を用いてトークンプロバイダー440が有する機能を説明する。トークンプロバイダー440は、エンドポイント選択部610、トークン取得部620、トークン管理部630、トークン配布部640、クライアント登録部650、鍵管理部660、Assertion JWT生成部670、id_token検証部680を有する。
エンドポイント選択部610は後述の認可フローにおいて、認可エンドポイントに対し認可リクエストを送信する機能である。その際、エンドポイント選択部610は全リージョン共通の認可エンドポイントURL(以下、全リージョン共通URL)を選択する。全リージョン共通URLの一例を表1に示す。
表1は、「No.」(項目番号)と「認可エンドポイントURL」のカラムを有し、「認可エンドポイントURL」に全リージョン共通URLが登録されている。表1への全リージョン共通URLの登録は外部のアプリケーション等から実行しても良く、表1への登録の形態は問わない。
トークン取得部620は後述の認可フローにおいて、トークンエンドポイントにトークン要求を送信する機能である。トークンエンドポイントは後述のid_tokenを元に、トークン取得部620によって決定される。
トークン管理部630は、トークン取得部620が取得した認可トークンをローカルユーザーID毎に管理する機能である。トークン管理部630が管理するトークンデータベースの一例を表2に示す。
表2は、「No」、「ローカルユーザーID」、「リージョン」、「認可トークン」のカラムを有し、ローカルユーザーIDを主キーとする。表2は後述の認可フロー(S1.0~S2.2)が実行されたことで生成、または更新され、トークン管理部630で管理される。ここで、「リージョン」に格納された情報は後述のid_tokenから取得された情報であり、認可トークンの取得先である認可サーバーのリージョンを示す。
トークン配布部640は表2に基づいて、アプリケーション420から受信したローカルユーザーID(認可トークン要求に含まれる)に紐付くリージョン情報と認可トークンを特定し、認可トークンをアプリケーション420に送信する機能である。
アプリケーション420から受信したローカルユーザーIDが表2に存在しない場合、図5の認可フローが実行されていないと判断される。そして、エンドポイント選択部610は図5の認可フローを実行し、取得した認可トークンと、ローカルユーザーID、後述のid_tokenから取得したリージョン情報をトークン管理部630(表2)に格納する。
クライアント登録部650は、認可サーバー200、201に対してクライアントをクライアント登録する機能である。鍵管理部660はクライアント登録時に取得するAssertion秘密鍵(Assertion JWT 署名用の暗号鍵)を保持する。この鍵は、後述の認可AssertionとトークンAssertionに署名する際に用いられる。
また、鍵管理部660は、認可サーバー200、201に保持するid_token秘密鍵(id_tokenに署名を付与する暗号鍵)に対応するid_token公開鍵(id_tokenの署名を検証する復号鍵)を予め保持しており、各々の鍵の保持および取得機能を有する。
Assertion JWT生成部670は鍵管理部660のAssertion秘密鍵を用いて、後述の認可AssertionとトークンAssertionを生成する機能である。id_token検証部680は、鍵管理部660のid_token公開鍵を用いて後述のid_tokenを検証する機能である。以上が、トークンプロバイダー440が有する機能である。
図5、図13を用いてクライアント登録時のフローと、認可フローを説明する。また、上記で説明済みの処理については、詳細な説明を省略する。
まず、図13を用いて、クライアント登録時の処理を説明する。OAuth 2.0におけるAuthorization Code Grantをベースとした本実施例の認証認可フローを実行するための事前操作として、認可サーバー200にクライアント400を登録するための登録要求を行う(S0.0)。具体的には、クライアント400の登録要求は認可サーバー200の登録エンドポイント(図5、13ではエンドポイントを「EP」と記載)に対して送信され、クライアント400の起動時か、または後述のS1.1の認可フローの開始時にクライアント400が未登録であった場合に開始される。クライアント登録要求を送信する方法としては、トークンプロバイダー440のクライアント登録部650が能動的に認可サーバー200と通信する方法や、ユーザーがWebブラウザー510を介して認可サーバー200にアクセスしてクライアント400を登録する方法が挙げられる。
S0.0のクライアント登録要求には、後述の認可確認画面に表示するためのクライアント名、説明、アイコン画像、および必須パラメーターであるリダイレクトURIが含まれる。リダイレクトURIとは、クライアント400が後述の認可レスポンスを送信する送信先を指定するアドレスである。クライアント400の登録要求を受信した認可サーバー200は、クライアント400を識別するためのクライアントIDと、クライアントを認証するために鍵ペア(Assertion公開鍵、Assertion秘密鍵)を生成し、クライアント400の登録応答としてクライアント400にAssertion秘密鍵を送信する(S0.1)。Assertion秘密鍵の送り方については、鍵交換のプロトコルによって暗号化して送信してもよい。
トークンプロバイダー部440は鍵管理部660にAssertion秘密鍵を保存する。認可サーバー200はクライアントIDとAssertion公開鍵と、S0.0で取得した各種情報とリダイレクトURIとを紐づけて保持する。トークンプロバイダー部440は、鍵管理部660にS0.1で受信したクライアントIDとAssertion秘密鍵を保持する。
図13のクライアント登録では、トークンプロバイダー440(クライアント400)と同じリージョン内に存在する認可サーバー200に対して実行される。その際に生成され、保存されるクライアント400に関する情報(クライアントIDやAssertion公開鍵等)は、認可サーバー200のみならず、別の認可サーバー(例えば認可サーバー201)に対しても共有される。その結果、ユーザー毎に認証要求の送信先(後述のS1.5)が異なっても、認可サーバーで共有されているクライアントIDやAssertion公開鍵を用いることで、後述のid_tokenの発行や認可トークンの発行等のやり取りを実行することができる。
以上が認可フローを実行する事前操作であるクライアント登録処理である。
図5を用いて、クライアント登録後の認可フローについて説明する。
ユーザーはクライアント400にログインする(S1.0)。クライアント400の認証部430は、ログインしたユーザーを特定するための情報であるログインコンテキストを生成し保持する。生成されたログインコンテキストを用いることで、ログインしたユーザーを特定する情報(ローカルユーザーID等)をログインコンテキストから取得することができる。
ユーザーがWebブラウザー510を介して認可開始のURIにアクセスすることで、本実施例のOAuth 2.0をベースとした認可フローを開始する(S1.1)。クライアント400は認可フローを開始するための認可開始URIにアクセスされると、認可エンドポイントに対して認可リクエストを送信する(S1.2)。この認可エンドポイントは、全リージョン共通URIを介してアクセスされる。
<認可エンドポイント>
ここで、認可エンドポイントの特定方法について説明する。トークンプロバイダー440は適切な認可サーバーを選択して認可トークンを取得するために、まず全リージョン共通URIに対して認可リクエストを送信する。認可リクエストが送信された結果アクセスされるDNS(Domain Name System)サーバーには、認可エンドポイントURLとIPアドレスの紐付けデータ(DNSレコード)が管理されている。Webブラウザーを介して認可サーバーにアクセスする際にはこのDNSサーバーを経由し、DNSレコードに基づいて全リージョン共通の認可エンドポイントURLがIPアドレスに変換(名前解決)される。その際、Geo Routing機能(AWSの場合はGeoRouting機能)は、認可リクエスト元(クライアント400)のIPアドレスから地理データベースを参照し、適切な認可エンドポイントURIに変換され、認可リクエスト送信元に送信される。
本実施例では、クライアント400と認可サーバー200とが同じリージョン「jp」に存在する。そのためトークンプロバイダー440は、Webブラウザー510を介して全リージョン共通URIにアクセスした場合、Geo Routing機能により同じリージョン「jp」に存在する認可サーバー200の認可エンドポイントURIが返信される。その認可エンドポイントURIに対してトークンプロバイダー440は認可リクエストを送信する。図5に示すS1.2は、Geo Routing機能により特定された認可エンドポイントURIに対して認可リクエストが送信された状態を示す。
<認可リクエスト>
トークンプロバイダー440が送信する認可リクエストについて説明する。トークンプロバイダー440が認可リクエストを送信する際、セキュリティ情報(後述のid_token)の取得依頼も送信する。
認可リクエストはresponse_type、client_id、redirect_uri、stateパラメーターを含む、署名付きのJWT形式で表現される。以下、説明の都合上、JWT形式の認可リクエストを「認可Assertion」と称する。認可Assertionは後述のヘッダーとペイロードとを含む。
認可リクエストに対し、S0.1のクライアント登録応答時に入手したAssertion秘密鍵を用いて付与され、署名アルゴリズムはJWA(RFC7518 JSON Web Algorithms)で規定されるES256(ECDSA using P-256 curve and SHA-256 hash)である。認可Assertionのヘッダーの一例を図8(a)に示す。
「typ」はJWTのタイプであり、Assertion JWTであることを示す値「Assertion」が設定されている。「alg」は署名アルゴリズムを示し、値「ES256」が設定されている。「kid」は、JWTの署名検証に用いるAssertion公開鍵とAssertion秘密鍵のIDを示す。「kid」に設定される値としては、UUIDなどの他にJSON Web Key(JWK)Thumbprint(RFC 7638)仕様に基づく公開鍵のThumbprintの値等がある。
認可Assertionのペイロードクレームの一例を図8(b)に示す。「response_type」はOAuth2.0のレスポンスタイプを示し、後述の認可レスポンスでid_tokenを取得するため、値「id_token」が設定されている。
「iss」はJWTの発行者(issuer)を識別するための識別子であり、認可Assertionの場合はクライアントIDを示すUUIDが値として設定される。「sub」はユーザー識別子を表し、「iss」と同様にクライアントIDを示すUUIDが入る。「iss」と「sub」は各々URL SafeなBase64形式で表した文字列をエンコードしてJWT形式の認可リクエストに含める。「exp」は認可Assertionの有効期限、「iat」は認可Assertionの発行日時を示し、共にUnix Epoch(1970年1月1日(世界標準時))からの経過秒数で表される。
図8(b)のペイロードクレームはさらに、OAuth2.0のリダイレクトURIを示す「redirect_uri」と、「state」を含む。「state」は認可リクエストと認可レスポンスとを一意に紐づけるための情報であり、CSRF(cross-site request forgery)攻撃や、トークン置換攻撃を防ぐために用いられる。そのため、stateは推測不可能でかつ重複しない値である必要がある。後述の認可レスポンスを受信したクライアント400は、stateの値とS1.2の認可リクエストで送信したstateの値とが一致するかを検証する。認可リクエストを実行したローカルユーザーを識別するために、クライアント400で発行されるstateはリダイレクトURIとログインコンテキストと紐付いて、クライアント400で管理される。
トークンプロバイダー440はJWT仕様に基づき、図8で示したような認可Assertionを作成する。認可Assertionには先に述べたAssertion秘密鍵を用いてJWT形式の署名(不図示)が付与される。以上が認可リクエストの説明である。
図5の説明に戻る。S1.2で認可リクエストを受信した認可サーバー200は、Webブラウザー510に対して全リージョン共通のログイン画面を応答する(S1.3)。ログイン画面にはhiddenフィールドで認可Assertionを含める。ユーザーは、Webブラウザー510を介してユーザーIDとパスワードを入力し、認可サーバー200に対して認証要求を行う(S1.4)。その際、先にログイン画面のhiddenフィールドとして受信した認可Assertionを認証要求と同時にPOSTする。ここで、S1.4で認可サーバー200に送信されるユーザーIDは、認可サーバーにログインするためのユーザー識別子であり、S1.0のローカルユーザーIDとは異なる。
認可サーバー200は、ユーザーIDの所属リージョン(ユーザーIDで特定されるユーザーのユーザー情報を管理する認可サーバーのリージョン)を判定し、適切なリージョンの認可サーバーにログイン画面をリダイレクトする(S1.5)。異なるリージョンの認可サーバー同士が共有するユーザー所属リージョン表の一例を表3に示す。
ユーザーID(ハッシュ値)は、ユーザーID文字列についてsha256アルゴリズムで算出したハッシュ値である。所属リージョンはユーザーIDで特定されるユーザーが所属するリージョンである。表3より、「user1@110AA」(ハッシュ値:b927736961c523464a5559982a527eccd18277cbeeec092ea67959990241bcc3)の所属リージョンは「jp」、「user2@110Ab」(ハッシュ値:8afe0cae0d1a4fbb380348ff1999aa1d40ecf829a730b82bdcb6a628796b51b2)の所属リージョンは「eu」、「user3@120AA」(ハッシュ値:25dac1eaecc81673cb64157be38babb6a13b53b020e2d88dfdca70054c84cf03)の所属リージョンは「jp」である。
ユーザー所属リージョン表(表3)はユーザー登録の際に更新され、定期的に全リージョンの認可サーバーで最新データを共有する。ユーザーIDはハッシュ値であるため、この値からユーザーIDを復元することは一般に不可能である。そのため、ユーザー所属リージョン表(表3)を全リージョンの認可サーバーで共有しても、ユーザー情報を共有していることにはならない。
S1.5におけるログイン画面のリダイレクトについて説明する。S1.3の全リージョン共通のログイン画面においてユーザーID「user2@110Ab」、パスワード「password」が入力されたものとする。認可サーバー200は入力されたユーザーIDのハッシュ値を算出する。算出したハッシュ値から表3を参照して、ユーザーの所属リージョン「eu」が特定される。そして、ユーザーID、パスワード、認証要求でPOSTされた認可Assertionが、Webブラウザー510のCookieに応答され、リージョン「eu」の認可サーバーである認可サーバー201のログインURLに対し、認証要求としてリダイレクトされる。
本実施例では、表3に格納された所属リージョンから、認可サーバー201のログインURLを特定する形態を示した。具体的には、異なるリージョンの各認可サーバーのログインURLの型が予め決まっており、その型に対して表3の「所属リージョン」をあてはめることで、各認可サーバーのログインURLを特定する形態である。本実施例の形態(表3)に限定されず、ユーザーIDのハッシュ値に対し認可サーバーのログインURLを紐付けて管理しておく形態でもよい。
認可サーバー201はS1.5でリダイレクトされたユーザーIDとパスワードとの紐付け情報が事前に登録されている紐付け情報と一致するかを検証し、一致する場合は認証トークンを発行する。発行された認証トークンはWebブラウザー510のCookieに応答される。以上が、ログイン画面のリダイレクトの説明である。
図5の説明に戻る。認可サーバー201はユーザーに対して、クライアント400の認可を同意するための認可確認画面をWebブラウザー510に応答する(S1.6)。認可確認画面の一例を図12に示す。認可確認画面1200は、ユーザーに対して同意を求める内容として、認可の対象となるクライアント400のクライアント名1201、クライアント400に関する説明1202、および、アイコン画像1203を有する。さらに認可確認画面1200は、ユーザーがクライアント400を認可するための許可ボタン1204、認可を拒否するための拒否ボタン1205を備える。拒否ボタン1205が押下された場合の処理、または許可ボタン1204が押下された場合の処理(S1.7)については後述する。
認可確認画面には、リダイレクトされた認証要求に含まれる認可Assertion をhiddenフィールドとして含む。ただし、認証要求に含まれる認可Assertionの署名を検証した後、認可Assertionに含まれるクライアントIDとリダイレクトURIとの組み合わせが、認可サーバー201や別のリージョンの認可サーバーとで共有されたクライアントIDとリダイレクトURIとの組み合わせと一致しない場合は、Webブラウザー510に認可確認画面ではなく、エラー画面を応答する。これによりに、URLへの不正なリダイレクトを防ぐことができる。また、認可確認画面1200の拒否ボタン1205が押下された場合も、エラー画面がWebブラウザー510に送信される。
認可サーバー201にログイン中のユーザーが既に同一のクライアントIDで認可操作済みであった場合はS1.6とS1.7の処理を省略できる。
許可ボタン1204が押下されたことで、ユーザーによる認可操作が実行された(S1.7)後、認可サーバー201は、認可操作に含まれる認可Assertionを認可サーバー201の認可エンドポイントに対してPOSTする(S1.8)。認可サーバー201は、認可エンドポイントにPOSTされた認可Assertionを検証する。ここで認可Assertionを検証する理由としては、認可サーバー201にとって外部(Web ブラウザー510)からの指示(今回は認可操作)であるため、認可Assertionの内容が詐称されていないか、認可Assertionを検証する必要がある。
認可Assertionの検証が成功した場合はid_tokenを生成し、クライアント400のリダイレクトURIに対して認可レスポンスとしてid_tokenを送信する(S1.9)。つまり、生成されたid_tokenは、認可サーバー201からWebブラウザー510を介して、クライアント400に送信される。送信する際には、id_tokenをリダイレクトURIのクエリパラメーターとして付与しWebブラウザー510に送信する。それにより、リダイレクトURIで指定された宛先にid_tokenをリダイレクトされる。認可サーバー201で生成されたid_tokenは、クライアントID、ユーザーID、リダイレクトURIと紐づいて認可サーバー201で保存される。
S1.8の認可Assertionの検証に失敗した場合は、認可サーバー201はWebブラウザー510に対して認可エラーを応答する。
<id_token>
認可サーバー201で生成されるid_tokenは、認可サーバーによるエンドユーザー認証に関するクレームを含んだセキュリティトークンであり、OpenID Connect仕様(OpenID Foundation OpenID Connect Core 1.0)で規定されている。id_tokenには、認可トークンの利用先リージョン情報が含まれ、署名付きのJSON Web Token(JWT RFC7518、JWT RFC7515)で表される。一般にid_tokenには、エンドユーザー認証に関するクレーム群(Claims about the Authentication)と、その他のユーザー属性に関するクレーム群が含まれる。本実施例におけるid_tokenは、ペイロードクレームに「iss」、「sub」、「aud」、「exp」、「iat」、「nonce」を含む。
id_tokenの署名はid_token秘密鍵を用いて付与され、署名アルゴリズムはJWAで規定されるES256署名である。id_tokenのヘッダーの一例を図9(a)に示す。尚、図8で説明済みの部分については説明を省略する。
id_tokenのヘッダーは、「alg」で示されるid_tokenの署名アルゴリズム「ES256」と、id_tokenの署名検証に用いるid_token公開鍵・id_token秘密鍵のIDを示す「kid」を含む。kidとしてはUUIDなどの他に、JSON Web Key(JWK)Thumbprint(RFC 7638)仕様に基づく公開鍵のThumbprintの値を用いてもよい。
id_tokenのペイロードに存在するユーザー属性に関するクレームの一例を図9(b)に示す。「iss」にはOpenID Connect Core 1.0の定義により、クエリーとフラグメント部を含まない「https://」で始まるURLが設定される。今回は、id_tokenの発行者が認可サーバー201であるため、認可サーバー201を示す「https://eu-auth.example.com」が設定される。
「aud」はid_tokenの発行対象を示し、今回はクライアントIDの値が設定される。「sub」と「aud」は、各々URL Safe なBase64形式で表した文字列となる。「nonce」は主にリプレイアタックを防ぐ目的でid_tokenに含まれ、stateパラメーターの値が設定されている。以上がid_tokenに関する説明である。
図5の説明に戻る。id_tokenの署名付与にはid_token秘密鍵、id_tokenの検証にはid_token公開鍵が必要である。id_token秘密鍵は異なるリージョンの各認可サーバーで予め共有されており、id_token公開鍵は予めクライアント400に保存されているものとする。
S1.9で認可レスポンスを受信したクライアント400は、認可レスポンスに含まれるid_tokenの署名(不図示)を検証し、id_tokenに含まれる「nonce」と、クライアント400が管理する「state」とが一致するかを判定する。一致すると判定された場合、クライアント400はid_tokenの「iss」を参照して、id_tokenの発行者である認可サーバー201のURLを取得する。今回は、トークンプロバイダー部440のid_token検証部680が、id_tokenの「iss」を参照し認可サーバー201のURL「https://eu-auth.example.com」を取得するものとする。取得した認可サーバー201のURLのホスト名「eu-auth」のハイフンより前の文字列「eu」を参照し、リージョン文字列を認識する。認識されたリージョン文字列は、トークンデータベース(表2)に格納される。
トークンデータベースにはさらに、現在クライアント400にログインしているローカルユーザーIDも格納される。そして、認可サーバー201のトークンエンドポイントに対して、認可トークンを取得するためのトークン要求を送信する(S2.0)。トークン要求はJWT形式で記載され、以下、認可リクエスト時のAssertion JWTと区別するために、JWT形式のトークン要求を「トークンAssertion」と称する。トークンAssertionは、ヘッダーとペイロードとを含む。また、トークンAssertionには、クライアントIDと、id_tokenのsubクレームから取得したユーザーIDと、リダイレクトURIが含まれる。トークンAssertionのヘッダーの一例を図10(a)に示す。
「typ」はJWTのタイプを示し、Assertion JWTであることを示す値「Assertion」が設定されている。署名アルゴリズムを示す「ES256」、JWTの署名検証に用いるAssertion公開鍵・Assertion秘密鍵のIDを示す「kid」を含む。kidとしてはUUIDなどの他に、JSON Web Key(JWK)Thumbprint(RFC 7638)仕様に基づく公開鍵のThumbprintの値を用いてもよい。
トークンAssertionのペイロードクレームの一例を図10(b)に示す。上記で説明済みの部分については、説明を省略する。
「response_type」はOAuth2.0のレスポンスタイプを示し、「id_token」が設定されている。またOAuth2.0のクライアントIDを示す「iss」、OAuth2.0のリダイレクトURIを示す「redirect_uri」、ユーザー識別子を表す「sub」がペイロードクレームに含まれる。「sub」には、本実施例においては先に取得したid_tokenに含まれる値が設定される。
トークンプロバイダー440は、JWT仕様に基づき図10で示したようなヘッダーやペイロードを含むトークンAssertionを作成する。トークンAssertionには、クライアント登録応答時に取得したAssertion秘密鍵を用いて付与された署名が含まれる(JWTの署名部分の詳細については省略する)。
S2.0でトークン要求を受信した認可サーバー201はAssertion公開鍵を用いて、トークンAssertionの署名を検証する。さらに認可サーバー201は、S2.0で受信したトークンAssertionを解析し、「iss」、「sub」、「redirect_uri」、「iat」、「exp」を取得する。取得した情報の解析により、S1.2の認可リクエストを送信したクライアント400とS2.0のトークン要求を送信したクライアント400とが一致するか、認可トークンを要求するユーザーのユーザー情報が認可サーバー201に存在するか、を認可サーバー201で検証する事ができる。
検証が成功した場合、認可サーバー201はクライアント400に対してトークン応答として、認可トークンを送信する(S2.1)。トークンプロバイダー440のトークン管理部630はトークンデータベース(表2)に対し、取得した認可トークンを格納する。
トークンプロバイダー440のトークン配布部640は、トークン管理部630が有するトークンデータベース(表2)から、現在ログイン中のユーザーIDを検索し、リージョン情報と認可トークンを取得する。取得したリージョン情報と認可トークンをアプリケーション420に送信する(S3.0)。
アプリケーション420は受信した認可トークンとリージョン情報に基づいて、リソースサーバー301が公開するAPIにアクセスする(S3.1)。具体的には、事前にアプリケーションに内蔵されているリージョン毎のリソースサーバーURL(不図示)と、トークンプロバイダー440から取得したリージョン情報を用いて、リソースサーバー301が公開するAPIにアクセスする。本実施例では、ユーザー情報を管理する認可サーバー201と同じリージョンeuに存在するリソースサーバー301に、S3.1のリソース要求が送信される。
以上が認可フローである。本実施例により、ユーザーの手動操作を介することなく、ユーザー情報が存在する認可サーバーを適切に選択し、選択した認可サーバーが認可トークンを発行することができる。また取得した認可トークンを用いて、ユーザー情報が存在するリージョンのリソースサーバーに対し、リソースを要求することができる。
[実施例2]
実施例2では、認可リクエスト(S1.2)と認可レスポンス(S1.9)が正常に終了した後、トークン要求(S2.0)までの間にユーザーが別のリージョンに移動した場合に、トークン取得を継続する手段を説明する。
具体的には、S1.2~S1.9において認可されたユーザーが、出張や引っ越し等で別のリージョンを移動したとする。その際、移動したユーザーのユーザー情報も、移動先のリージョンの認可サーバーに移動させる必要がある。そのユーザー情報を移動させている最中に、ユーザーの移動前にユーザーを認可した認可サーバーに対し、トークン要求が送信される状況を想定する。
まず、図6を用いて、認可レスポンス(S1.9)からトークン要求(S2.0)の間に、認可されたユーザー情報が認可サーバー201から移動させている際の処理を説明する。図6の処理は、トークンプロバイダー440(クライアント400)が主体で実行されるトークン要求処理である。
トークンプロバイダー440は認可サーバー200に対して認可リクエストを送信する(S6.0)。本処理は実施例1におけるS1.2と同様の処理である。トークンプロバイダー440は認可レスポンスを受信する(S6.1)。本処理は実施例1におけるS1.9と同様である。その際、トークンプロバイダー440は、認可レスポンスに含まれるid_tokenを検証する。検証後、認可サーバー201のトークンエンドポイントに対して、JWT形式のトークン要求(トークンAssertion)を送信し(S6.2)、それに対するトークン応答を受信する(S6.3)。トークンプロバイダー440はトークン応答を解析し、トークン応答に認可トークンが含まれているかを判定する(S6.4)。含まれていると判定された後は、実施例1と同様、S3.0に進む。含まれていないと判定された後は、トークン応答にユーザー移動先情報が含まれているかを判定する(S6.5)。
ユーザー移動先情報が含まれているトークン応答の一例を図11に示す。図11の「destination_url」は後述のユーザー移動先情報を元に認可サーバー201が判定した、ユーザー情報の移動先である移動先トークンエンドポイントを示す。
S6.5においてトークン応答にユーザー移動先情報が含まれていると判定された場合、S6.2の処理に戻り、ユーザー移動先情報で特定される移動先トークンエンドポイントに対してトークン要求を改めて送信する。S6.2~S6.5の処理は、トークン応答に「destination_url」が含まれる限り、繰り返し実行される。ただし、実行回数がある一定の値を越えた場合や一定の時間が経過した場合に、トークンプロバイダー440がエラーを起こして処理を終了する等の形態も可能である。
S6.5においてトークン応答にユーザー移動先情報が存在しないと判定された場合、トークンプロバイダー440はS6.0の処理に戻り、認可リクエストを認可サーバー200に送信する。S6.5からS6.0に戻る処理は、トークン応答にユーザー移動先情報が含まれるまで、繰り返し実行される。ただし、S6.2へ戻る処理と同様、実行回数や処理時間に制限を設け、超過した場合に、トークンプロバイダー440がエラーを起こして処理を終了する等の形態も可能である。以上が図6の処理である。
図7を用いて、トークンプロバイダー440からトークン要求を受信した認可サーバー201が、トークン応答を送信する処理を説明する。S2.0と同様に、認可サーバー201はトークンエンドポイントにトークンAssertionを受信する(S7.1)。認可サーバー201は、Assertion公開鍵を用いてトークンAssertionを検証し、「sub」からユーザー識別子を取得する(S7.2)。その際、認可サーバー201は、取得したユーザー識別子が認可サーバー201に存在するか判定する(S7.3)。存在すると判定された場合は、実施例1のS2.1と同様に、認可トークンをトークン応答としてクライアント400に送信する(S7.4)。認可サーバー201にユーザー識別子が存在しないと判定された場合は、ユーザー識別子がユーザー情報移動先テーブルに存在するかを判定する(S7.5)。判定の際に参照するユーザー情報移動先テーブルの一例を表4に示す。
ユーザー情報移動先テーブルは、ユーザー識別子と移動先トークンエンドポイントのカラムを有する。移動先トークンエンドポイントは、ユーザー情報を異なるリージョンの認可サーバーに移動した際に、その移送先である認可サーバーのトークンエンドポイントURLである。
S7.5においては具体的に、トークンAssertionの「sub」に含まれるユーザー識別子「dXNlcjJAMTEwQUI」が存在するかを判定する。ユーザー識別子が存在すると判定された場合、対応する移動先トークンエンドポイントを取得して、移動先トークンエンドポイントURLを「destination_url」として記載したトークン応答をトークンプロバイダー440に送信する(S7.6)。「destination_url」が、図6の処理で記載した「ユーザー移送先情報」である。
S7.5においてユーザー識別子が存在しないと判定された場合、認可サーバー201はエラー応答をトークンプロバイダー440に送信して処理を終了する。
本実施例により、認可されたユーザーのユーザー情報が別の認可サーバーに送信された際にトークン要求が実行されても再度認可することなく、認可トークンを取得するまでの処理を続行させることができる。
[その他の実施例]
上記の実施例では、Geo Routing機能を用いることで、トークンプロバイダー440(クライアント400)と地理的に近い認可サーバー200に、認可リクエストが送信される形態を示した。それは、アクセス時間等を考慮したことによるものだが、ユーザー所属リージョン表(表3)が共有されている認可サーバーであれば、認可リクエストの送信先の決定方法は問わない。
また、本発明の目的は以下の処理を実行することによっても達成される。即ち、上述した実施例の機能を実現するソフトウェアのプログラムコードを記録した記憶媒体を、システム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)が記憶媒体に格納されたプログラムコードを読み出す処理である。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施例の機能を実現することになり、そのプログラムコード及び該プログラムコードを記憶した記憶媒体は本発明を構成することになる。