Flutter移动端如何通过已配置Azure AD的Web应用登录并获取访问令牌
方案解答
你的需求完全可以实现,不需要额外新增太多适配改造,核心走OAuth 2.0 授权码流+PKCE即可,具体实现逻辑如下:
核心实现路径
- 无需单独为移动端注册新的Azure AD应用,直接复用现有Web应用对应的Azure AD客户端ID即可,只需要提前在Azure AD的应用注册配置中补加移动端的重定向URI,格式可选用自定义Scheme格式,比如
com.your.app://auth/callback,也可以用微软推荐的msauth://<你的应用包名>/<base64编码的应用签名哈希>,只要和Flutter端配置的回调地址保持一致即可。 - Flutter端不需要自行开发Azure AD登录页面,直接通过认证SDK拉起系统内置浏览器,加载现有Web应用对应的Azure AD登录入口,用户完成身份校验后,浏览器会自动将授权码回传给Flutter应用。
- 拿到授权码后,Flutter端直接向你现有部署的Identity Server的令牌端点发起请求,即可交换得到Identity Server签发的访问令牌、刷新令牌,该令牌和Web端登录后获取的令牌效力完全一致,可直接用于调用Web应用的API接口。
Flutter端落地建议
直接使用flutter_appauth封装包完成整个认证流程,不需要自行处理浏览器拉起、授权码捕获、令牌交换的逻辑,核心配置参数如下:
配置项要求:
授权端点:和现有Web应用使用的Azure AD授权端点保持一致
令牌端点:填现有Identity Server的令牌端点地址
客户端ID:和Web端使用的Azure AD客户端ID完全一致
重定向URI:提前在Azure AD中配置好的移动端回调地址
Scope:包含Web端API对应的权限scope,以及openid、profile、offline_access等OIDC必填scope
必须开启PKCE配置,这是移动端这类公共客户端的强制安全要求
备选实现方案
如果出于权限隔离要求不想复用Web端的Azure AD应用配置,也可以单独为移动端注册一个Azure AD应用,给该应用授予访问现有Web API的权限,移动端登录拿到Azure AD签发的令牌后,再向Identity Server发起兑换请求,拿到Identity Server签发的访问令牌即可。该方案比复用配置的方案多了一步令牌兑换流程,复杂度更高,没有特殊需求优先选择第一种方案。
注意事项
- 提前确认你的Identity Server已经开启了公共客户端的授权码流+PKCE支持,没有拦截移动端的认证请求
- 配置的移动端重定向URI需要同时在Azure AD应用注册、Identity Server的客户端配置中录入,避免回调校验失败
- 访问令牌过期后可直接通过刷新令牌向Identity Server换发新令牌,不需要用户重复登录
内容的提问来源于stack exchange,提问作者Low Chen Thye
相关产品推荐
相关产品推荐

