没有client_secret的OAuth2授权代码PKCE(wso2 5.3.0 IAM)

时间:2017-07-27 16:46:07

标签: oauth oauth-2.0 wso2 wso2is wso2carbon

我目前正在尝试在公共客户端/本机客户端(Android App)上实施OAuth 2.0授权代码授权。

由于无法在设备上存储Realm,因此我想将此授权类型与rfc7636 / Proof Key for Code Exchange by OAuth Public Clients (PKCE).一起使用

我在后端使用wso2 5.3.0 IAM。

授权步骤完全正常,但如果没有client_secret,我就无法获取访问令牌:client_secret

我是否误解了PKCE的授权代码授权错误,或者我错过了IAM中的某些配置?

相比之下:可以使用auth0

最诚挚的问候, 罗伯特

3 个答案:

答案 0 :(得分:2)

是的,由于Apache OLTU库已在内部用于实现OAuth2功能,因此在WSO2 IS实施中必须使用client_secret。

目前无法按照说明将申请注册为公共客户。

然而,这并不意味着必然存在任何安全隐患。基本上建议说的是,不要将client_secret嵌入移动应用程序中,因为它会使其容易受到攻击。它没有为受保护的后端资源提供任何额外的安全性,因为客户端请求无论如何都不使用client_secret进行身份验证。如果你只是对待" Base64(client_id:client_secret)"作为一个单独的字符串,它不会对协议的协议或安全性产生任何影响。

因此,在将WSO2 IS与移动应用程序一起使用时,需要遵循以下建议。

  1. 使用授权代码授予类型,该类型需要client_secret。
  2. 使用PKCE(在WSO2 IS 5.2.0之后)
  3. 如果您有其他类型的客户或渠道用于相同的应用程序,例如像web一样,然后在IS中将它们注册为一个单独的服务提供者,并为它们生成一对独立的client_id,client_secret。
  4. 禁用" client_credentials"您在WSO2 IS中注册的特定OAuth2移动客户端的授予类型,以便这些应用无法在没有用户身份验证的情况下获取访问令牌。
  5. 更进一步,如果您需要为每个移动应用程序实例提供唯一的客户端凭据,请使用OAuth2动态客户端注册(DCR)即时生成客户端凭据。
  6. 通过遵循以上5条建议,它可以提供与规范中建议的安全级别相同的安全级别。

答案 1 :(得分:1)

即使您使用授权代码流,如果您的应用程序的客户端类型机密,则在令牌端点需要client_secret。 RFC 6749中的“4.1.3. Access Token Request”如下所示:

  

如果客户端类型是机密的 或客户端已获得客户端凭据(或分配了其他身份验证要求),则客户端必须使用授权服务器进行身份验证在第3.2.1节中描述。​​

因此,请将应用程序的客户端类型更改为 public 。我不知道WSO2,但我想它提供了设置菜单来切换客户端类型,如下所示。

enter image description here
Authlete的网络控制台的截图)

机密客户端和公共客户端的定义在RFC 6749的“2.1. Client Types”中描述。

答案 2 :(得分:0)

对于授权授权流程,您可以使用空client_secret发送请求。尝试像client_secret=''一样放置空字符串,它应该按预期工作。如果没有client_secret参数,则无法请求TOKEN_URI。

PKCE用于保护authorization code被盗,授权代码有效期为10分钟,当auth代码兑换access_token时,我们还发送code_verifier以确保授权代码不被某人隐藏。同时生成code_verifiercode_challenge,并在请求身份验证代码时使用code_challenge&在请求code_verifier

时使用access_token