我目前正在尝试在公共客户端/本机客户端(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。
最诚挚的问候, 罗伯特
答案 0 :(得分:2)
是的,由于Apache OLTU库已在内部用于实现OAuth2功能,因此在WSO2 IS实施中必须使用client_secret。
目前无法按照说明将申请注册为公共客户。
然而,这并不意味着必然存在任何安全隐患。基本上建议说的是,不要将client_secret嵌入移动应用程序中,因为它会使其容易受到攻击。它没有为受保护的后端资源提供任何额外的安全性,因为客户端请求无论如何都不使用client_secret进行身份验证。如果你只是对待" Base64(client_id:client_secret)"作为一个单独的字符串,它不会对协议的协议或安全性产生任何影响。
因此,在将WSO2 IS与移动应用程序一起使用时,需要遵循以下建议。
通过遵循以上5条建议,它可以提供与规范中建议的安全级别相同的安全级别。
答案 1 :(得分:1)
即使您使用授权代码流,如果您的应用程序的客户端类型机密,则在令牌端点需要client_secret
。 RFC 6749中的“4.1.3. Access Token Request”如下所示:
如果客户端类型是机密的 或客户端已获得客户端凭据(或分配了其他身份验证要求),则客户端必须使用授权服务器进行身份验证在第3.2.1节中描述。
因此,请将应用程序的客户端类型更改为 public 。我不知道WSO2,但我想它提供了设置菜单来切换客户端类型,如下所示。
(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_verifier
和code_challenge
,并在请求身份验证代码时使用code_challenge
&在请求code_verifier
access_token