2016-11-21 11 views
2

私は解決策を探していましたが、見つけられませんでした。ここで私が実行したいシナリオだWSO2からOAuthトークンを取得するためにPHPでSAML2トークンを取得する方法APIM

この質問

は直接に関係している

  1. はSAML2を使用してSPへの認証します。 SimpleSamlPhpでPHPでコード化されています。
  2. SAML2アサーションを使用して、API mgrエンドポイントからOAuthトークンを取得します。 (URL http://api.gateway/tokenを使用)
  3. OAuthトークンを使用してAPI mgrのゲートウェイ経由でAPIを呼び出します。

私は命令で立ち往生しています:SAML2アサーショントークンを取得します。 このトークンはどこにありますか? SimpleSamlPhpでは、ユーザーの属性またはIDを取得できますが、アサーションは見つかりません。

最後のアサーションを取得するためにSSPをハッキングしましたが、その処理方法がわかりません。私は単一の値(トークンのような)を期待していましたが、それは複雑な構造です。上のリンクの1つに、私はそれにアクセスすべきではないと言います!

トークンURLに何をエンコードして送信しますか?


EDIT:いくつかのサンプルを追加します。 マイアサートXMLは、(編集済み):

<?xml version="1.0" encoding="UTF-8"?> 
<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" ID="okdjgbm...jdbh" IssueInstant="2016-11-28T09:49:45.808Z" Version="2.0"> 
    <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://g...p.com:9443/samlsso</saml2:Issuer> 
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
     <ds:SignedInfo> 
     <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
     <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> 
     <ds:Reference URI="#okd...kejdbh"> 
      <ds:Transforms> 
       <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
       <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> 
      </ds:Transforms> 
      <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> 
      <ds:DigestValue>RrGcR...cktFuH0=</ds:DigestValue> 
     </ds:Reference> 
     </ds:SignedInfo> 
     <ds:SignatureValue>b91j/k...Z7d4=</ds:SignatureValue> 
     <ds:KeyInfo> 
     <ds:X509Data> 
      <ds:X509Certificate>MIICNT...Wq8uHSCo=</ds:X509Certificate> 
     </ds:X509Data> 
     </ds:KeyInfo> 
    </ds:Signature> 
    <saml2:Subject> 
     <saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">[email protected]</saml2:NameID> 
     <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> 
     <saml2:SubjectConfirmationData InResponseTo="_80258326a1...cd4bbd" NotOnOrAfter="2016-11-28T09:54:45.807Z" Recipient="http://1.2.3.4/simplesamlphp/www/module.php/saml/sp/saml2-acs.php/wso2-sp" /> 
     </saml2:SubjectConfirmation> 
     <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> 
     <saml2:SubjectConfirmationData InResponseTo="_8025832...d4bbd" NotOnOrAfter="2016-11-28T09:54:45.807Z" Recipient="https://my.wso2.apim:8243/token" /> 
     </saml2:SubjectConfirmation> 
    </saml2:Subject> 
    <saml2:Conditions NotBefore="2016-11-28T09:49:45.808Z" NotOnOrAfter="2016-11-28T09:54:45.807Z"> 
     <saml2:AudienceRestriction> 
     <saml2:Audience>mytestapp</saml2:Audience> 
     <saml2:Audience>https://my.wso2.apim:8243/token</saml2:Audience> 
     </saml2:AudienceRestriction> 
    </saml2:Conditions> 
    <saml2:AuthnStatement AuthnInstant="2016-11-28T09:49:45.815Z" SessionIndex="1f5192...b591"> 
     <saml2:AuthnContext> 
     <saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml2:AuthnContextClassRef> 
     </saml2:AuthnContext> 
    </saml2:AuthnStatement> 
    <saml2:AttributeStatement /> 
</saml2:Assertion> 

エンコードをbase64でURLエンコードされたXMLとして:他からコピーした方法を使用して

PHNhbWwyO...dGlvbj4,

SOそれは程度だ

function base64_url_encode($input) { 
return strtr(base64_encode($input), '+/=', '-_,'); 
} 

を投稿します20行の長さです(そして、最後にコンマがあります)。それは動作しません

、私は、JSONの結果をトレースで

{"error":"invalid_grant","error_description":"Provided Authorization Grant is invalid."} 

を得る:

TID: [0] [AM] [2016-11-29 11:04:50,297] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.grant.saml.SAML2BearerGrantHandler} - SAML Token Issuer verification failed or Issuer not registered {org.wso2.carbon.identity.oauth2.token.handlers.grant.saml.SAML2BearerGrantHandler} 
TID: [0] [AM] [2016-11-29 11:04:50,298] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} - Invalid Grant provided by the client, id=fkJa...Ohoa, user-name=null to application=myapp-subscriber_test_PRODUCTION {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} 
TID: [0] [AM] [2016-11-29 11:04:50,300] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} - OAuth-Error-Code=invalid_grant client-id=fkJa...hoa grant-type=urn:ietf:params:oauth:grant-type:saml2-bearer scope=PRODUCTION {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} 

私はシステムのコンフィギュレータに周りに聞いていますのよ。私にはIDS、APIMとOAuthの間のリンクには何かがありません。いくつかの宣言があります。 (私はこれを検索し、私がしたアサーションの発行者IDを確認するためにstackoverflow交換を思いついたが、何か間違っているものは何も識別できない)

助けてくれてありがとう私は何か新しいことがあります。私が何かを見落としてしまった場合を除いて、もちろん!

+0

は、http://stackoverflow.com/questions/19866021/how-to-get-saml2-bearer-assertion-profile-for-oauth-within-wso2-api-manager-to-w?rqに関連している可能性があります。 = 1 – JRobinss

+0

は、http://stackoverflow.com/questions/34738716/wso2-saml2bearergranthandler-saml-token-issuer-verification-failed-or-issuer-notに関連している可能性があります。 – JRobinss

答えて

1

私は成功したので、同じ問題を抱えている可能性がある他の人たちのためのいくつかの兆候があります。

  1. 彼らは(https://github.com/simplesamlphp/simplesamlphp/issues/220を参照)SAML2アサーションを提供していないので、私はsimpleSamlPhpをハッキング。私はうまくやっていませんでした。私はそれを機能させたいからです。それは醜いですが、それは動作します。ここに私のハックだ、私はSAML2-acs.phpのライン125でそれを置く:私のPHPアプリケーションで

    // ADDED to get SAML2 assertion in SP 
    if (array_key_exists('SAMLResponse', $_POST)) { 
        $attributes["samlresp"] = $_POST['SAMLResponse']; 
    } 
    
  2. を、私はこのコードを使用します

    $authdata_array= $as->getAuthDataArray(); 
    $postSaml2Assert = $authdata_array["Attributes"]["samlresp"]; 
    $msg = base64_decode($postSaml2Assert); 
    $document = new DOMDocument(); 
    $document->loadXML($msg); 
    $assertion = $document->getElementsByTagNameNS ("urn:oasis:names:tc:SAML:2.0:assertion", "Assertion")->item(0); 
    $saml2AssertionXml = $document->saveXML($assertion); 
    
  3. を私はアサーションBASE64をエンコードし、 URLエンコードこのために私は私がに値を設定/エンティティプロバイダ/リスト/ myIdSが/編集/連合オーセンティケータ/ SAM2ウェブSSO .../IDプロバイダのエンティティIDAPIMにPassing base64 encoded strings in URL(感謝joeshmo!)

  4. からコードを使用しました予想されるIDSエンドポイント、https://myids:9443/samlsso。 これは、私がOAuthのは、観客と受信者の両方としてトークン追加(IDS)でSPの構成で

  5. 私の最初の問題を解決しhttps://myAPIM:9443/oauth2/token/のように見えます。注意、両方の聴衆として受信者!

  6. 私はデバッグしていたので、XMLアサーションをフォーマットしていたので機能しませんでした。WSO2 Identity Server OAuth2 Bearer SAML Assertionの問題が発生しましたので、フォーマットを取り除いてXMLストリングをそのまま使用しました。 (私はもちろん、上からこのエラーを削除した)

  7. 私は解決しやすい最後のエラーが発生しました: NotOnOrAfterフラグはトラブルを作っていた、SAML2アサーションを取得し、生成するためにそれを使用しての間に遅延があったのでトークン。教訓:SAML2アサーションは、APIを呼び出す前だけでなく、ログイン直後に作成する必要があります。

これが他の人に役立つことを望みます。助けてくれてありがとう@Bhathiya!

2

SAML SSOでログインすると、AssertionというSAML応答が返されます。サンプルレスポンス/アサーションhereが表示されます。 OAuth2トークンを取得するには、このアサーションが必要です。しかし、あなたのPHPフレームワークがSAMLの応答をあなたに直接提供しないようです。あなたがここにそれが必要なので、それはあまりにも悪いです。

とにかく、それを取得できたので、base64-URL<Assertion>....</Assertion>タグ全体をエンコードし、OAuth2トークンリクエストで送信するだけです。手動で試す必要がある場合はHere is a nice online toolを入力してください。

+0

迅速な対応に感謝します。 SSPに追加したハックで試してみる。 – JRobinss

+0

私はあなたの助言に従った:単一値のトークンを探すのではなく、XMLでアサーション全体を取り出し、base64-url-encodeでそれをエンコードし、 'assertion = ...'として渡した。私が間違っていたことは何ですか、あるいはAPIMにちょっとした設定がありますか?(元の質問のサンプルを参照してください) – JRobinss

+0

ログには何かが得られますか? – Bee

関連する問題