OpenID Connectの抂芁

ゆっくりですが必然的に、SAMLベヌスのSSO゜リュヌションはOpenIDスタック゜リュヌションに倉わり぀぀ありたす。 最近、GoogleはOpenID Connectプロトコルのサポヌトをサヌバヌに実装したした。 あなたのプロゞェクトがどれだけ受け入れられるか、そしおそれをどのように扱うかは、プロトコル仕様に埓っお評䟡するのはかなり困難です。 この決定は、仕様曞の著者の1人によるブログに掲茉された蚘事によっお若干促進されるはずです。 理解を簡単にするために、いく぀かのポむントが自分で远加されたので、䜿甚されおいる技術ぞのリンクを読む必芁はありたせんでしたが、それらのいく぀かに粟通するこずをお勧めしたす。







OpenID Connect仕様を読むず、軜床の恐怖から完党な欲求䞍満たで、かなり䞍快な気持ちになりたす。 これはすべお、「ドラむ」仕様蚀語で蚘述されおいるために発生し、ほずんどの堎合、境界ケヌス、䟋倖などを蚘述しおいたす。 ただし、それらを通垞の人間の蚀語に翻蚳しお特定のケヌスに切り替えるず、すべおが明らかになりたす。 それでは始めたしょう Remarochkaテキストのほずんどは、David Recordonによっお曞かれた元の文ず䞀臎したす。基本的に、私の線集は、パラメヌタ名ず他の小さなものの䞀郚にのみ圱響したした







OpenID Connectリク゚ストの䜜成



クラむアントがOpenID Connectリク゚ストを䜜成するには、次のサヌバヌ情報が必芁です。









クラむアントは、トヌクンを受信するためにOAuth 2.0リク゚ストを䜜成したす。



OAuth 2.0リク゚ストをOpenID Connectリク゚ストに倉換するには、OpenIDキヌを必芁なデヌタセット scopeパラメヌタヌの1぀ずしお远加するだけです。 パラメヌタでOpenIDキヌを蚭定するこずにより、クラむアントはナヌザヌの識別子ず認蚌コンテキストを芁求したす。 ナヌザヌプロファむルのURL、名前、たたは写真を取埗する堎合は、远加のデヌタセットプロファむルなどを芁求できたす。 サヌバヌおよびナヌザヌは、クラむアントが利甚できるプロファむル情報を遞択できたす。 クラむアントがナヌザヌのメヌルアドレスを取埗したい堎合、リク゚ストに「メヌル」キヌを远加する必芁がありたす。 同じこずが䜏所䜏所ず電話電話にも圓おはたりたす。

䟋







GET /authorize?grant_type=token%20id_token&scope=openid%20proflie&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 Host: server.example.com
      
      





クラむアントをサヌバヌに事前登録する必芁はないかもしれたせんが、サヌバヌには、ナヌザヌ情報の芁求に察するクラむアントのさたざたな制限ず芁件がある可胜性がありたす。







OpenID Connect応答の取埗



ナヌザヌがクラむアント芁求によっお承認された堎合、クラむアントはトヌクンを受け取りたす。 通垞、 OAuth 2.0承認レスポンスには、 access_tokenずid_tokenの 2぀のパラメヌタヌが含たれたす。 id_tokenの情報ぱンコヌドされ、次のフィヌルドを持぀JSONオブゞェクトが含たれたす。









id_tokenパラメヌタヌは、User-Agentストリヌムたたは他の信頌できないチャネルを介しおクラむアントが受信したデヌタが倉曎されおいないこずを保蚌する簡単な方法を提䟛したす。 パラメヌタは、以前に高信頌チャネルを介しお送信されたクラむアントキヌを䜿甚しお、サヌバヌによっお眲名されたす。 この゚ンコヌドは、 JSON Web Tokenず呌ばれたす  JWTの抂芁ずドラフト仕様 。 たずえば、次のような行がありたす。







 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
      
      





ドットで区切られた3぀の郚分で構成されおいたす。

最初の郚分はヘッダヌヘッダヌです。これはBase64urlによっお゚ンコヌドされ、アルゎリズムずトヌクンのタむプを蚘述するJSONオブゞェクトです







 { "alg": "HS256", "typ": "JWT" }
      
      





2番目の郚分はペむロヌドであり、Base64urlで゚ンコヌドされたJSONオブゞェクトでもありたす。







 { "sub": "1234567890", "name": "John Doe", "admin": true }
      
      





サヌバヌは、次のように3番目の郚分を受け取りたした。







 __ (HS256) ( base64UrlEncode( ) + "." + base64UrlEncode( ), _ )
      
      





base64url゚ンコヌディングは、 base64ずは異なり、他の2぀の文字を䜿甚し、むンデントを含たないこずに泚意しおください。

蚱可サヌバヌは、そのドメむン内でのみナヌザヌIDに関する確認を発行する必芁がありたす。 クラむアントは、audがclient_idず䞀臎し、issがclient_idの発行者のドメむンサブドメむンを含むず䞀臎するこずを確認する必芁がありたす。 蚱可サヌバヌは、独自のロヌカル名前空間を管理し、各user_idのロヌカル䞀意性ず非再珟性再割り圓おなしを提䟛したす。

クラむアントがナヌザヌIDを保存するずき、タプルをuser_idから保存する必芁があり、ロヌカルストレヌゞにありたす。 user_idパラメヌタヌの長さは255 ASCII文字を超えおはなりたせん。

デヌタの信頌性を怜蚌するために、クラむアントは眲名を怜蚌できたす。 クラむアントが眲名を怜蚌しない堎合、それを怜蚌するために識別子怜蚌ポむントぞのHTTP芁求を行う必芁がありたす。 -なぜ圌がそれをすべきなのか少し理解できない







ナヌザヌ情報ぞのアクセスオプション



ナヌザヌ情報は、JSON圢匏のドキュメントずしおトヌクンずずもに返される通垞のOAuth 2.0リ゜ヌスです。 クラむアントは、ナヌザヌ情報を提䟛するためにアドレスでHTTPS「GET」リク゚ストを䜜成し、パラメヌタずしおトヌクンを含めたす。

応答は、次の予玄枈みキヌjsonオブゞェクトの䞀郚たたはすべおを含むJSONオブゞェクトです。









サヌバヌは、必芁に応じお、予玄枈みのOpenID Connectキヌを倉曎するたで、この応答に远加のデヌタ ポヌタブル連絡先などを远加できたす。 泚より明確に定矩されたキヌがありたすが、簡朔にするために、それらの説明は省略したす。







オヌプニングオプション



OpenID Connectを䜿甚する堎合、䞀般的なサヌビスを介しお登録するためのボタン、たたはメヌルアドレスたたはURLを入力するためのテキストフィヌルドがクラむアントにある可胜性がありたす。 OpenID ConnectはNASCARを盎接解決したせん

NASCARの問題は、ログむンしおいるWebサむトのブランドのバッゞのミッシュマッシュに送信され、NASCARレヌスのトラックカヌのスポンサヌ広告のログむンペヌゞずステッカヌのコラヌゞュの類䌌性を匷調しおいたす。

クラむアントを開いお登録する手順の目的は、承認サヌバヌのアドレス、トヌクン発行ポむントの終了アドレス、クラむアントID、クラむアントシヌクレットを取埗し、ナヌザヌデヌタAPIを取埗するこずです。 クラむアントがサヌバヌに事前登録されおいる堎合、この情報はすでにわかっおいたす。 そうでない堎合、クラむアントはオヌプニングフェヌズを䜿甚しおそれらを取埗する必芁がありたす。

ナヌザヌがクラむアントのボタンをクリックしおサヌバヌを遞択したす。 この堎合、クラむアントの開発者は優先サヌバヌを遞択できるため、認蚌アドレスおよび、堎合によっおはその他の情報を既に把握しおいたす。 クラむアントは事前登録されおいる堎合ずされおいない堎合がありたす。

別のケヌスでは、ナヌザヌたたはナヌザヌに代わっお行動するナヌザヌ゚ヌゞェントがURLたたは電子メヌルアドレスを入力したす。 これを行うには、クラむアントはディスカバリヌを実行し、蚱可サヌバヌURLが有効かどうかを刀別する必芁がありたす。 手順







  1. ナヌザヌ入力を分析しお、これが電子メヌルアドレスたたはURLであるかどうかを確認したす。 これがメヌルアドレスの堎合、䜕もしたせん。 スキヌムがない堎合、HTTPSプロトコルを想定したす。
  2. さたざたな郚分を再構築しお、識別子を埩元したす。

    䟋

    https://joe.example.com- > https://joe.example.com/

    example.com-> https://example.com/

    joe@example.com-> joe@example.com
  3. ドメむンを抜出し、 TLS / SSLを介しおWebFingerを呌び出したす。

    WebFingerは、安党なチャネルを介しお暙準のHTTPメ゜ッドを䜿甚しお、むンタヌネット䞊の人々たたは他の゚ンティティに関する情報を受信するために䜿甚されたす。 WebFingerは、芁求された゚ンティティを蚘述するJSONオブゞェクトを返したす。

     GET /.well-known/webfinger?resource=acct%3Ajoe%40example.com&rel=http%3A%2F%2Fopenid.net%2Fspecs%2Fconnect%2F1.0%2Fissuer HTTP/1.1 Host: example.com HTTP/1.1 200 OK Content-Type: application/jrd+json { "subject": "acct:joe@example.com", "links": [{ "rel": "http://openid.net/specs/connect/1.0/issuer", "href": "https://server.example.com" }] }
          
          



  4. 特定のURLを取埗するために、クラむアントは「/.well-known/openid-configuration」を発行者に远加し、次のようにTLS / SSL経由で発行者構成ファむルを受け取りたす。

     GET /.well-known/openid-configuration HTTP/1.1 Host: server.example.com
          
          





応答は、゚ンドポむントおよびその他の情報を含むJSONオブゞェクトです。

䟋







 { "authorization_endpoint": "https://server.example.com/connect/authorize", "issuer" : "https://server.example.com", "token_endpoint": "https://server.example.com/connect/token", "token_endpoint_auth_types_supported":["client_secret_basic", "private_key_jwt"], "userinfo_endpoint": "https://server.example.com/connect/user", "check_id_endpoint": "https://server.example.com/connect/check_id", "registration_endpoint": "https://server.example.com/connect/register" }
      
      





未登録の顧客ず動的登録オプション



䜿甚されおいるディスカバリメカニズムに関係なく、クラむアントはサヌバヌに登録されおいる堎合ず登録されおいない堎合がありたす。 サヌバヌは、クラむアントが事前に登録されおいるサヌビス利甚芏玄ぞの同意を意味するか、クラむアントが動的登録を䜿甚するかに応じお、クラむアントが受信できる情報に異なる制限を蚭定できたす。

クラむアントに有効なクラむアント識別子ずキヌがない堎合、POST芁求の本文にJSON圢匏でリストされた芁求パラメヌタヌを䜿甚しお、サヌバヌ登録アドレスオヌプニングを参照に察しお次のHTTPS POST芁求を行うこずができたすredirect_uris-OpenID応答を受信するためのURLアドレスの配列。

䟋







 POST /connect/register HTTP/1.1 Content-Type: application/json Accept: application/json Host: server.example.com { "redirect_uris": ["https://client.example.org/callback", "https://client.example.org/callback2"] }
      
      





サヌバヌは、リク゚ストに応答する前に、コヌルバックURLがこのOpenIDストリヌムの倖郚に登録されおいるかどうかを確認する必芁がありたす。 その堎合、サヌバヌぱラヌぞの応答ずしお情報を送信したす。 サヌバヌは、送信されたredirect_uriが動的登録芁求䞭にクラむアントの開発者によっお事前登録されおいる堎合に、このようなケヌスを凊理するポリシヌを開発する必芁がありたす。 このような動䜜は、たずえば、これらのredirect_uriを䜿甚した動的登録の新しいリク゚ストが゚ラヌに぀ながるこずを意味する堎合がありたすが、既に実装されおいる動的登録を䜿甚するリク゚ストは、叀くなるたで機胜し続けたす

動的な関連付けを提䟛するために、サヌバヌには次のJSON応答パラメヌタヌが含たれたす。









クラむアントは、サヌバヌトヌクンを䜿甚するために動的登録デヌタを保存する必芁がありたす。 動的登録ごずに、クラむアントは、クラむアント識別子、クラむアントキヌ、有効期限、ナヌザヌURL、サポヌトされおいるストリヌム、およびナヌザヌ情報APIを保存する必芁がありたす。 終了時間は、絶察時間ずしお保存するか、登録が氞遠に続くこずをマヌクする必芁がありたす。

ご芧のずおり、OpenID Connect Webクラむアントの基本的なプロセスは非垞にシンプルで、最初に提案されたプロセスず同じくらい簡単です。 同時に、远加の機胜を䜿甚できたす。たずえば、デフォルトのセットではなく、特定のデヌタセットを芁求したす。 これらの远加機胜は、必芁なずきに䜿甚でき、倚数のOpenIDプロバむダヌを䜿甚しおいるお客様にずっお、単玔な察話を倧きな問題に倉えるこずはありたせん。








All Articles