React Native使用react-native-azure-auth对接Azure AD未获刷新令牌问题
排查react-native-azure-auth未返回refresh token的问题
我之前在使用react-native-azure-auth对接Azure AD时也碰到过一模一样的问题,结合Azure AD的权限规则和这个库的特性,你可以从这几个关键点入手排查:
1. 确认使用的授权流程支持refresh token
隐式授权流(Implicit Flow)是不会返回refresh token的,而offline_access scope只有在授权码流+PKCE的模式下才会生效。你需要检查AzureAuth的初始化代码,确保启用了PKCE流程:
const azureAuth = new AzureAuth({ clientId: '你的clientId', tenantId: '你的tenantId', authorizationFlow: 'PKCE', // 必须设置这个来启用授权码流 redirectUrl: '你的redirectUrl', // 要和Azure门户配置的一致 });
2. 验证Azure AD应用的权限配置
虽然你提到已经添加了offline_access,但还是要再确认两个点:
- 在Azure门户的应用注册API权限页面,确保添加了Microsoft Graph的
offline_access委托权限(这是微软身份平台的标准权限,用于获取refresh token) - 如果是企业租户内的应用,需要点击授予管理员同意,否则普通用户可能无法获取该权限
3. 强制用户重新授权权限
如果用户之前已经授权过其他权限,但没包含offline_access,Azure AD会默认跳过该权限的同意提示。你可以在调用authorize时添加prompt: 'consent'参数,强制用户重新确认所有权限:
let tokens = await this.azureAuth.webAuth.authorize({ scope: 'offline_access profile User.ReadBasic.All Mail.Read', prompt: 'consent' // 强制弹出权限同意界面 });
这样用户登录时会明确看到offline_access的权限选项,同意后Azure AD才会返回对应的refresh token。
4. 检查scope参数的传递
虽然你写的scope看起来没问题,但要注意:
offline_access是独立的scope,不需要和其他Graph权限归为一类,确保它被正确包含在scope字符串中- Azure AD的scope不区分大小写,但要避免拼写错误(比如写成
offlineaccess)
做完这些调整后,你再调用登录接口,应该就能在响应中拿到refresh token,并且返回的scope里会包含offline_access了。
内容的提问来源于stack exchange,提问作者yanivtwin
相关产品推荐
相关产品推荐

