仅通过Client ID获取OAuth Token遇问题,无Client Secret及Redirect URL求方案
以下是几个符合你需求(仅传client_id、无client secret、无redirect_url)的可行方案:
客户端凭证模式(Client Credentials Grant)
这是服务间授权的标准模式,若你的身份提供商支持公共客户端配置,可以只通过client_id请求token。部分厂商允许将这类客户端标记为无需secret,请求时只需在表单或参数中传入client_id,并指定grant_type=client_credentials。注意这个模式是基于客户端身份授权,而非用户身份,适合无用户参与的后台服务调用场景。调整隐式授权模式(Implicit Grant)的配置
你遇到的错误是因为身份提供商要求必须配置redirect_uri。对于无浏览器的客户端,可配置特殊的合规redirect_uri,比如urn:ietf:wg:oauth:2.0:oob(Out-of-Band,专门用于无跳转场景)或http://localhost。在客户端配置页面添加该uri后,请求时带上redirect_uri=urn:ietf:wg:oauth:2.0:oob,就能绕过错误。这个uri不需要实际可访问,仅用于满足OAuth协议的校验要求。资源所有者密码凭证模式(Resource Owner Password Credentials Grant)
若你的客户端是内部可信应用(如企业内部工具),可以让用户提供用户名和密码,客户端携带client_id、用户名、密码,以grant_type=password请求token。但这个模式不符合OAuth最佳实践,存在密码泄露风险,仅建议在受控的内部场景使用。JWT Bearer授权模式
若客户端能生成签名JWT,可使用JWT替代client_secret。客户端用自身私钥生成包含client_id等信息的JWT,请求时携带grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer和JWT参数。身份提供商通过预先配置的公钥验证JWT有效性,无需传递secret。此方案需要身份提供商支持该模式,且提前完成公钥配置。
内容的提问来源于stack exchange,提问作者Chris_dev

