You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

react-native-msal集成iOS真机与Microsoft Authenticator联动登录失败问题

react-native-msal集成iOS真机与Microsoft Authenticator联动登录失败问题

我们团队在开发集成了MSAL的React Native应用时,用了react-native-msal库,目前在Android、Web和iOS模拟器上都跑的很顺,但iOS真机上碰到了个头疼的问题:

如果用户手机上装了Microsoft Authenticator,登录时会直接唤起Authenticator应用,选完账号后,会跳回我们的应用但指向一个不存在的页面,最后用户根本登不进去。但要是卸载了Authenticator,应用会唤起浏览器走认证流程,登录就完全正常——我们得同时支持浏览器和Authenticator两种认证方式才行。

我们的MSAL配置大概是这样的:

export const config: MSALConfiguration = {
  auth: {
    clientId: "CLIENT_ID", // 替换为实际客户端ID
    // 这个authority是`acquireToken`和`acquireTokenSilent`方法的默认值,除非方法单独传入其他值
    authority: "https://login.microsoftonline.com/TENANT_ID", // 替换为实际租户ID
    redirectUri: Platform.select({
      android: "msauth://com.example.app/ANDROID_REDIRECT_URI", // 替换为实际Android重定向URI
      ios: "msauth.com.example.app://auth", // 替换为实际iOS重定向URI
      default: undefined,
    }),
  },
};

我们已经试过这些操作:

  • 严格按照react-native-msal的iOS集成指南一步步配置
  • 卸载Authenticator后浏览器认证正常,但必须要兼容Authenticator的使用场景

可能的排查方向与解决办法

1. 核对重定向URI的格式与全链路一致性

Authenticator对重定向URI的格式校验超级严格,你得确保这几个地方完全匹配:

  • 代码里的iOS redirectUri(比如你写的msauth.com.example.app://auth
  • Azure AD应用注册中iOS平台的重定向URI
  • Xcode项目里配置的URL Scheme(应该是msauth.com.example.app,和重定向URI的前缀一致)

要是这三者有任何一处不一样,Authenticator跳回来的时候就会出问题。

2. 检查Xcode的Associated Domains配置

用Authenticator的话,必须配置正确的Associated Domains:

  • 打开Xcode项目,选对应的target → Signing & Capabilities → 点击+号添加Associated Domains
  • 添加applinks:login.microsoftonline.com这个域名,这是MSAL和Authenticator联动必需的

3. 确认Info.plist里的唤起权限配置

要让应用能唤起Authenticator,得在Info.plist里加对应的URL Scheme白名单:

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>msauthv2</string>
  <string>msauthv3</string>
</array>

没有这个配置的话,应用可能找不到Authenticator,或者唤起后无法正确跳转回来。

4. 验证AppDelegate里的URL跳转处理逻辑

Authenticator跳回应用的URL必须要让MSAL正确接收处理,不然就会跳到无效页面。你得检查AppDelegate的代码(Objective-C或Swift)是否正确实现了URL处理:

比如Objective-C的写法:

#import <React/RCTLinkingManager.h>
#import <MSAL/MSAL.h>

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
  // 先检查是不是MSAL的跳转请求
  if ([url.scheme isEqualToString:@"msauth.com.example.app"]) {
    return [MSALPublicClientApplication handleMSALResponse:url];
  }
  // 其他跳转交给React Native的LinkingManager处理
  return [RCTLinkingManager application:app openURL:url options:options];
}

如果这段代码没加或者写错了,MSAL就接不到Authenticator回来的认证结果,自然登录失败。

5. 清缓存重装测试

有时候iOS的缓存会导致配置不生效,你可以试试:

  • 删掉设备上的应用和Authenticator
  • 清理Xcode的Derived Data(菜单里选Product → Clean Build Folder,或者直接去对应文件夹删除)
  • 重新构建并安装应用
  • 再装回Authenticator,重新走认证流程试试

应该就是上述某一个配置环节出了问题,尤其是URL Scheme和AppDelegate的处理逻辑,这俩是Authenticator联动最容易踩坑的地方。

备注:内容来源于stack exchange,提问作者Kyle Atienza

火山引擎 最新活动