Flutter跨平台应用Azure AD B2C认证redirect_uri不匹配问题求助
问题修复方案
1. 修正Redirect URI不匹配问题
Azure门户中注册的redirect_uri是com.bol.azure_test://oauth/redirect,但你的代码里仅填写了com.bol.azure_test,这是错误提示的直接原因。修改代码中的redirect_uri参数为:
'redirect_uri': 'com.bol.azure_test://oauth/redirect',
2. 修复授权端点URL格式
你当前的端点路径存在语法错误,正确的Azure AD B2C授权端点格式如下,记得替换{your-tenant-name}为实际租户名称(比如租户域名是bol.onmicrosoft.com,则填bol):
var uri = Uri.https( '{your-tenant-name}.b2clogin.com', '/{your-tenant-name}.onmicrosoft.com/B2C_1_signupsignin/oauth2/v2.0/authorize', queryParameters );
另外,grant_type参数无需在授权请求中携带,该参数是后续获取token时使用的。
3. 改用浏览器唤起登录页面(核心修正)
你当前用http.get直接请求授权端点是后端服务的调用逻辑,移动端必须唤起浏览器(或内嵌WebView)让用户完成登录交互。可以用Flutter的url_launcher包实现:
- 先在
pubspec.yaml添加依赖:dependencies: url_launcher: ^6.2.5 - 替换按钮点击逻辑,移除
http.get,改为打开浏览器:import 'package:url_launcher/url_launcher.dart'; // ... onPressed: () async { print("Find Azure API Button Click"); var queryParameters = { 'p': "B2C_1_signupsignin", 'client_id': "your-actual-client-id", // 替换为真实的client_id 'nonce': 'defaultNonce', 'redirect_uri': 'com.bol.azure_test://oauth/redirect', 'scope': "offline_access openid", 'response_type': "code", 'prompt': "login", }; var uri = Uri.https( '{your-tenant-name}.b2clogin.com', '/{your-tenant-name}.onmicrosoft.com/B2C_1_signupsignin/oauth2/v2.0/authorize', queryParameters ); if (await canLaunchUrl(uri)) { await launchUrl(uri, mode: LaunchMode.externalApplication); // 唤起系统浏览器 } else { print('无法打开登录页面'); } },
4. 配置应用URL Scheme
确保Flutter应用已注册对应的URL Scheme,让登录完成后能跳转回应用:
- Android:在
android/app/src/main/AndroidManifest.xml的主Activity中添加intent-filter:<activity android:name=".MainActivity" android:exported="true"> <!-- 原有配置 --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="com.bol.azure_test" /> </intent-filter> </activity> - iOS:在
ios/Runner/Info.plist中添加:<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>com.bol.azure_test</string> </array> </dict> </array>
5. 后续补充:获取Token
用户登录完成后,浏览器会携带授权码code跳转到com.bol.azure_test://oauth/redirect,你需要在Flutter中监听该URL跳转,拿到code后向B2C的token端点发送POST请求,获取access token和refresh token。
内容的提问来源于stack exchange,提问作者Sumchans
相关产品推荐
相关产品推荐

