如何在PHP中检索SAML2令牌以从WSO2 APIM获取OAuth令牌

如何在PHP中检索SAML2令牌以从WSO2 APIM获取OAuth令牌,php,oauth,wso2,saml-2.0,wso2-am,Php,Oauth,Wso2,Saml 2.0,Wso2 Am,我一直在四处寻找解决方案,但找不到 这个问题直接涉及: 下面是我要执行的场景: 使用SAML2对SP进行身份验证。使用SimpleSamlPhp用PHP编码 使用SAML2断言从API mgr端点获取OAuth令牌。(使用URL) 使用OAuth令牌通过API mgr的网关调用API 我被指令卡住了:获取SAML2断言令牌。 我在哪里可以找到这个代币? 在SimpleSamlPhp中,我可以获取用户的属性或其id,但找不到任何断言 我入侵了SSP以获取最后一个断言,但不知道如何处理它。我

我一直在四处寻找解决方案,但找不到

这个问题直接涉及:

下面是我要执行的场景:

  • 使用SAML2对SP进行身份验证。使用SimpleSamlPhp用PHP编码
  • 使用SAML2断言从API mgr端点获取OAuth令牌。(使用URL)
  • 使用OAuth令牌通过API mgr的网关调用API
  • 我被指令卡住了:获取SAML2断言令牌。 我在哪里可以找到这个代币? 在SimpleSamlPhp中,我可以获取用户的属性或其id,但找不到任何断言

    我入侵了SSP以获取最后一个断言,但不知道如何处理它。我期望一个值(比如令牌),但它是一个复杂的结构。上面的一个链接说我不应该访问它

    我应该向令牌URL发送什么(已编码)


    编辑:添加一些示例。 我的断言XML(已编辑):

    它大约有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之间的链接中缺少了一些东西,一些声明。 (我在谷歌上搜索了这个,并找到了一个stackoverflow exchange来检查断言中的发卡机构id,我确实这么做了,但我无法识别那里有什么错误)


    谢谢你的帮助,如果我有什么新的东西,我会回来的。当然,除非我忽略了一些显而易见的事情

    使用SAML SSO登录时,会得到一个SAML响应,其中包含一个
    断言。您可以看到一个示例响应/断言。您需要此断言来获取OAuth2令牌。但是,您的php框架似乎没有直接向您提供SAML响应。那太糟糕了,因为你需要它


    无论如何,既然您已经成功地获得了它,那么您现在所要做的就是
    base64 URL
    编码整个
    ,如果您需要手动尝试的话

    我已经成功了,所以这里有一些迹象表明其他人可能也有同样的问题

  • 我对simpleSamlPhp进行了黑客攻击,因为它们不提供SAML2断言(请参阅)。我没有以一种好的方式去做,因为我只想让它工作。虽然很难看,但它很管用。这是我的破解,我把它放在saml2-acs.php的第125行:

    // ADDED to get SAML2 assertion in SP
    if (array_key_exists('SAMLResponse', $_POST)) {
        $attributes["samlresp"] = $_POST['SAMLResponse'];
    }
    
  • 在我的PHP应用程序中,我使用以下代码:

    $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);
    
  • 我对断言base64和URL编码进行编码。为此,我使用了来自的代码(谢谢!)

  • 在APIM/Entity Providers/list/myIdS/edit/Federated Authenticators/SAM2 web SSO中…/标识提供程序实体ID我将该值设置为预期的IDS端点,。 这解决了我最初的问题

  • 在SP配置(在IDS中)中,我添加了oauth令牌作为访问群体和接收者,看起来像。作为观众和接受者都要小心

  • 因为我在调试,我已经格式化了XML断言,所以它不起作用,我遇到了这里详细介绍的问题,所以我只是删除了格式化并按原样使用XML字符串。(我当然已经从上面删除了这个错误)

  • 我有一个很容易解决的最后一个错误:notorAfter标志出现了问题,因为在获取SAML2断言和使用它生成令牌之间有一个延迟。经验教训:SAML2断言应该在登录之后创建,而不是在调用API之前创建


  • 希望这能帮助别人。谢谢@Bhathiya的帮助

    谢谢你的快速回复。我将尝试使用我添加到SSP中的hack,使用我得到的断言。我遵循了您的建议:我没有寻找单个值标记,而是将整个断言用XML编码,用base64 url encode编码,并将其作为
    断言=…
    传递。不起作用,是我做错了什么,还是我只是在APIM中有一些错误的配置?(参见原始问题中的示例)是的,我检查了它们,似乎应用程序注册有问题。我将编辑原始帖子以完成此操作(因为注释编辑器无法完成此任务!)看起来SP和SAML断言中的issuer值不同。请仔细检查。有几个问题。。。当出现这样的错误时,授权人会发生吗?还有,我应该比较什么?SP config中的“issuer”是应用程序的名称,而SAML消息中的“issuer”是is的URL(这里是WSO2 ID,与APIM分开)。谢谢可能与…有关可能与…有关
    // ADDED to get SAML2 assertion in SP
    if (array_key_exists('SAMLResponse', $_POST)) {
        $attributes["samlresp"] = $_POST['SAMLResponse'];
    }
    
    $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);