【问题标题】:WSO2 IS: Error using OAuth Authorization Code flow with SOAP APIWSO2 IS:将 OAuth 授权代码流与 SOAP API 一起使用时出错
【发布时间】:2018-12-16 22:41:42
【问题描述】:

我正在使用 OAuth 授权代码流对用户进行身份验证,并针对 WSO2 身份服务器授权我的应用程序。我正在使用带有 Passport.js 的简单节点/快递服务器来获取访问令牌,邮递员使用该访问令牌向 SOAP API 发出一些测试请求。

当使用承载令牌方法授权我的应用程序时,我在 IS 日志中收到以下错误:0 active authenticators registered in the system. The system should have at least 1 active authenticator service registered. 我在 Postman 中收到以下错误:500 Internal Server Error,响应正文如下,<faultstring>Authentication failure</faultstring>

这是 Postman 中的样子:

相同的访问令牌适用于 REST API 请求,例如“https://localhost:9443/scim2/Me”。

谁能告诉我这里缺少什么?

【问题讨论】:

  • OAUTH 没有'-',你能从令牌中删除'-',然后再试一次,同时你能告诉我在REST API 中,你是否在令牌字段中传递'-'与否
  • 嗨@amg_amit,感谢您的回复!我对 REST 端点使用完全相同的访问令牌,包括破折号 (-),并且我得到了返回的预期用户数据。我已经尝试为这两个请求删除令牌中的破折号,但当我这样做时都失败了。
  • 在 Postman 中,有一个标题选项卡,您可以选择并粘贴标题值,此标题在授权选项卡旁边
  • 嗨@amg_amit,这里是标题值:授权:承载873b4a13-a49b-321f-b43b-7a5e8eb6fc59 内容类型:文本/xml
  • 我可能还应该提到,如果我使用 Basic Auth 代替,请求有效。

标签: oauth-2.0 wso2 wso2is


【解决方案1】:

WSO2 Identity Server 中的 SOAP API 无法使用 Bearer 令牌进行身份验证。它们可以通过基本身份验证和 cookie 进行身份验证。这就是在响应中获得Authentication failure 的原因。

但身份服务器中的 REST API 可以使用 Bearer 令牌进行身份验证。所以/scim2/Me 使用访问令牌成功验证。

【讨论】:

  • 您好 Manduranga,感谢您的回复。我对如何让安全的 OAuth 授权流程正常工作有点困惑。如果我使用 OAuth2.0 针对 IS 对用户进行身份验证,那么我所拥有的只是一个承载令牌,对吗?那么我将如何将 SOAP API 与 OAuth2.0 授权代码流一起使用?
  • 用户认证后,如果需要获取用户信息,可以使用OIDC,而不是OAuth 2.0。如果你想做一些用户管理功能,你可以使用 SCIM 2 REST APIs。如果您解释您的实际用例,我将能够轻松地为您提供帮助。
  • 我希望在审批工作流和关联帐户方面复制当前仪表板的功能。看起来您无法从 SCIM2 REST API 获得必要的功能。为此推荐什么身份验证流程?我没有使用 SOAP 的经验,因此感谢您提供任何帮助 :)。
  • 您必须使用基本身份验证或 cookie 才能使您的方案正常工作。
  • 好的,谢谢你告诉我。从文档中看不出来。最后一个问题:当你说“或饼干”时,你到底是什么意思。您能否向我推荐一些关于此的文档?
【解决方案2】:

尝试从授权服务手动获取访问令牌并使用它

第一步:获取授权码

https://<is_server_url>:9443/oauth2/authorize?client_id=<id>&redirect_uri=<callback_url>&response_type=code&scope=openid

您将在回调 URL 上获得授权码

第二步:调用token服务获取access token

Post https://<is_server_url>:9443/oauth2/token
Content-Type:application/x-www-form-urlencoded
Authorization:Basic <base64encoded "<client_id>:<client_secret>">

grant_type:authorization_code
scope:openid
code:<code_from_step_1>
redirect_uri:<callback_url>

exp:

client_id=**abcdefgh12345678**
client_secret=**xyzsecretkey**
callback_url=**http://locahost/callback**
scope=openid

服务器:本地主机 base64encode(client_id:client_secret)= base64encode(abcdefgh12345678:xyzsecretkey) => YWJjZGVmZ2gxMjM0NTY3ODp4eXpzZWNyZXRrZXk=强>

  1. 获取 https://localhost:9443/oauth2/authorize?client_id=**abcdefgh12345678**&amp;redirect_uri=**http://locahost/callback**&amp;response_type=code&amp;scope=openid

它会用参数code向回调url发起请求,比如说code=this01is02your03code,请检查你的浏览器地址栏

  1. POST https://localhost:9443/oauth2/token

标题

Content-Type:application/x-www-form-urlencoded

Authorization:Basic **YWJjZGVmZ2gxMjM0NTY3ODp4eXpzZWNyZXRrZXk=**

身体

grant_type:authorization_code

scope:openid

code:this01is02your03code

redirect_uri:http://locahost/callback

这将返回一个访问令牌,假设服务器返回的令牌是 12345678ASDFGH

现在您可以使用此令牌调用任何 RestFull 或 SOAP 服务

Authorization: Bearer 12345678ASDFGH

【讨论】:

  • 嗨 Suresh,看起来 Maduranga 的上述响应是正确的,因为您实际上不能使用承载令牌来再次授权 SOAP API。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 2014-11-04
  • 2016-10-15
  • 1970-01-01
  • 2020-11-07
相关资源
最近更新 更多