1

OAuth + SAML ベアラー フローを使用して認証しようとしています (http://help.salesforce.com/help/doc/en/remoteaccess_oauth_SAML_bearer_flow.htm)

しかし、私は無効なアサーションエラーが発生している時点で立ち往生しています:

{"error":"invalid_grant","error_description":"invalid assertion"}

ここに私の主張があります:

<?xml version="1.0"?>
  <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="C625490D-C2B9-15BE-6DFA-7286288D9655" IssueInstant="2012-04-04T06:54:14Z" Version="2.0">
    <saml:Issuer>3MVG9Y6d_Btp4.....d0jnN</saml: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="#C625490D-C2B9-15BE-6DFA-7286288D9655">
          <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>f187DeCiwFhhH2etlU+5byskey4=</ds:DigestValue>
        </ds:Reference>
      </ds:SignedInfo>
      <ds:SignatureValue>
MIID6zCCAtOgAwI...........4qbvd3sxAQmkhR98FSsQixMI+bTHq9zRgeFu6W5GWsun3tmqNE=
</ds:SignatureValue>
    </ds:Signature>
    <saml:Subject>
      <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">org2@dot.com
      </saml:NameID>
      <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
        <saml:SubjectConfirmationData Recipient="https://login.salesforce.com/services/oauth2/token" NotOnOrAfter="2012-11-20T06:35:42Z"/>
      </saml:SubjectConfirmation>
    </saml:Subject>
    <saml:Conditions NotBefore="2012-11-19T06:34:42Z" NotOnOrAfter="2012-11-20T06:35:42Z">
      <saml:AudienceRestriction>
        <saml:Audience>https://login.salesforce.com/services/oauth2/token</saml:Audience>
      </saml:AudienceRestriction>
    </saml:Conditions>
    <saml:AuthnStatement AuthnInstant="2012-11-20T06:35:42Z" SessionIndex="ED868FE5-841D-5192-766C-941A60D6602F">
      <saml:AuthnContext>
        <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</saml:AuthnContextClassRef>
      </saml:AuthnContext>
    </saml:AuthnStatement>
  </saml:Assertion>

そして、これが私がリクエストを行う方法です:

curl https://login.salesforce.com/services/oauth2/token -H "Content-Type='application/x-www-form-urlencoded'" -d "grant_type=urn:ietf:params:oauth:grant-type:saml2-bearer" -d "assertion=`cat saml-assertion.base64`"

アサーションをbase64urlに適切にエンコードしました(以前は、アサーションの無効な文字に関するエラーが発生していましたが、これを修正しました)

私の主張が無効である理由を知るために、これについてさらに何を/どこで確認できるか教えてください! PS: 上記の URL のサンプル アサーションからすべてがコピーされ、ユーザー名、発行者、証明書は私が変更しました。また、ユーザーの正確なログイン時刻として NotBefore を設定しています。

4

1 に答える 1

-1

付与タイプの値は、送信時にエンコードする必要があります。urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Asaml2-bearer

Saml アサーションは単一のアサーションである必要があります。あなたがしたように Base64 でエンコードしてから、パディングまたは urlencode を再度削除する必要があります。

「アサーション」パラメーターの値には、単一の SAML 2.0 アサーションが含まれている必要があります。SAML アサーション XML データは
base64urlを使用してエンコードする必要があります。エンコード
は RFC 4648 [RFC4648] のセクション 5 の定義に従い、パディング ビットはゼロに設定されます。後続のエンコード手順の必要性を回避するために (たとえば、「application/
x-www-form-urlencoded」[W3C.REC-html401-19991224] による)、
base64url でエンコードされたデータは、改行して文字を埋め込むべきではありません
("= ") は含めないでください。

https://datatracker.ietf.org/doc/html/draft-ietf-oauth-saml2-bearer-17#section-2.1

ポスト エンコードされた値で送信:

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Asaml2-bearer& assertion=PHNhbWxwOl...[省略]...ZT4

于 2013-08-14T17:02:47.527 に答える