如何通过Azure B2C获取Sign in with Apple授权码(Ionic应用场景)
解决方案:Azure B2C + Sign in with Apple 令牌获取问题
核心结论
你的问题根源在于Azure B2C的配置缺失,不需要转换idp_access_token,只需调整B2C的身份提供者设置和用户流/自定义策略,就能获取Apple的id_token和授权码,进而支持令牌刷新、撤销及账号删除操作。
1. 调整Azure B2C中Sign in with Apple的配置
- 开启授权码类型:在Azure B2C的Sign in with Apple身份提供者配置页,选择
Authorization Code授权类型,同时请求的Scope需包含openid、email;如需离线访问能力,需添加offline_access以获取Apple的refresh token。 - 配置输出声明:在你的B2C用户流(或自定义策略)中添加自定义输出声明,将Apple返回的
id_token和授权码(code)映射为B2C返回给应用的字段:- 进入用户流的「应用程序声明」页面;
- 添加自定义声明(例如命名为
idp_apple_id_token、idp_apple_code); - 在身份提供者的声明映射中,将Apple返回的对应字段绑定到这些自定义声明。
2. 配置ionic-appauth获取额外声明
- 明确请求Scope:在
AuthConfiguration中,确保包含Azure B2C所需的Scope(如openid、offline_access)以及Apple要求的Scope,触发B2C从Apple获取完整的令牌和授权码。 - 提取自定义声明:登录成功后,通过ionic-appauth的用户信息接口或令牌解析逻辑,提取B2C返回的自定义声明。示例代码:
const user = await authService.getUserInfo(); const appleIdToken = user.idTokenClaims['idp_apple_id_token']; const appleAuthCode = user.idTokenClaims['idp_apple_code'];
3. 令牌刷新与账号删除的处理
- 令牌刷新:若无需直接操作Apple的令牌,可直接使用Azure B2C返回的
refresh_token刷新应用的access token;若必须操作Apple的令牌,需确保B2C配置中请求了offline_access,通过自定义声明获取Apple的refresh token。 - 账号删除:调用Apple的账号删除API时,直接使用B2C返回的
idp_apple_id_token或idp_apple_code即可,无需转换idp_access_token。
4. 关键检查点
- 确认Apple开发者后台的**服务ID(Service ID)**与Azure B2C中配置的客户端ID完全一致,且redirect URI完全匹配;
- 确保ionic-appauth使用Authorization Code Flow(而非Implicit Flow),因为Implicit Flow不会返回授权码;
- 使用ionic-appauth的最新稳定版本,避免兼容性问题。
内容的提问来源于stack exchange,提问作者Soutache
相关产品推荐
相关产品推荐

