2017-07-27 27 views
0

我正在尝试在公共客户端/本地客户端(Android应用程序)上实现OAuth 2.0授权代码授权。没有client_secret(wso2 5.3.0 IAM)的OAuth2授权码PKCE

由于不可能存储设备上的client_secret,我想用这个授权类型与rfc7636/Proof Key for Code Exchange by OAuth Public Clients (PKCE).

我在后端使用WSO2 5.3.0 IAM。

授权步骤工作完全正常,但我没能获得访问令牌没有client_secretinvalid_request, Missing parameters: client_secret

我误解了授权码授与PKCE错误还是我错过的IAM一些配置?

比较:有可能与auth0

最好的问候, 罗伯特

回答

1

即使你使用的授权码流,client_secret在令牌端点所需,如果您的应用程序的客户端类型为保密。 “4.1.3. Access Token Request”在RFC 6749表示如下:描述

如果客户类型是保密或客户端发出的客户端凭证(或交办的其他认证需求),客户端必须与授权服务器进行身份验证在3.2.1节中。

所以,你的应用程序的客户类型更改为公共。我不知道WSO2,但我想它提供了设置菜单来切换像下面这样的客户端类型。

enter image description here
Authlete的Web控制台的屏幕截图)

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

+0

感谢非常好的RFC引号使用code_challenge使用。所以理论上我正走在正确的轨道上。 我还没有看到在用户界面中的机密和公用客户端之间切换的可能性,但必须在某处配置一个配置。 –

1

是的,client_secret是强制性在WSO2 IS实现中,由于Apache OLTU库已在内部用于实现OAuth2功能。

目前没有办法将注册应用程序作为公共客户端解释。

但是,这并不意味着有任何安全隐患。基本上,建议所说的是,不要将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. 为您在WSO2 IS中注册的特定OAuth2移动客户端禁用“client_credentials”授予类型,以便这些应用无需用户身份验证即可获得访问令牌。
  5. 更进一步,如果您需要为每个移动应用程序实例拥有唯一的客户端凭据,请使用OAuth2动态客户端注册(DCR)来即时生成客户端凭据。

通过遵循以上5条建议,它可以为您提供与规范中建议的安全级别相同的安全级别。

0

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

PKCE用于保护authorization code的盗用,授权码有效期为10分钟,授权码被兑换为access_token时,我们还会发送code_verifier以确保授权码不被某个人占用。 code_verifiercode_challenge产生在一起,同时请求授权码& code_verifier同时请求access_token