如何在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以获取最后一个断言,但不知道如何处理它。我
编辑:添加一些示例。 我的断言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);