我尝试在 Postman 中使用带有 PKCE 流程的 OAuth 2.0 授权代码,然后在我的 flutter mobile 应用程序中使用,该应用程序可在 Android 和 iOS 系统上运行。 OAuth 2.0 在 Azure 中的应用程序级别进行配置。
我正在使用 myapp://logged-in 重定向 URL 从回调中读取访问令牌。由于重定向 URL 是针对 Mobile/Native 平台配置的,因此应用程序本身设置为 public。
不幸的是,授权不起作用。当我尝试使用 PKCE 流请求令牌时,出现以下错误。这是由应用程序注册中的public设置引起的。
错误:invalid_client,描述:AADSTS700025:客户端是公开的,所以 不应显示“client_assertion”和“client_secret”。
当我从请求中删除 client_secret 时,Postman 抛出
错误:invalid_request,描述:AADSTS900144:请求正文 必须包含以下参数:'client_id'。
基于以下文章:
https://stackoverflow.com/a/67097711/7586834
https://stackoverflow.com/a/63124656
我应该能够在不传递 ClientSecret 的情况下检索令牌。目前,作为解决方法,我正在使用隐式流程,并且它工作正常。但由于它已过时,我想切换到最新的流程。我应该改变什么/如何使其正常工作?
(我的应用程序中的清单文件)
<intent-filter android:label="flutter_web_auth_2">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" />
</intent-filter>
诗。我正在使用 flutter https://pub.dev/packages/flutter_web_auth_2 包。
我注册了一个应用程序,并通过启用公共客户端流选项在“移动和桌面应用程序”平台中添加了重定向URI:
请注意,当启用公共客户端流选项时,您不能通过 PKCE 流传递客户端密钥。否则,它将抛出以下错误:
当我删除客户端密钥并尝试使用具有相同 Postman 配置的 PKCE 流程生成令牌时,我也遇到了相同的错误,如下所示:
配置:
错误:
要解决该错误,请将
Client Authentication
方法更改为 “在正文中发送客户端凭据”,成功生成令牌,如下所示:
配置:
代币:
当我在 jwt.ms 网站中解码上述令牌时,它具有以下声明: