使用Azure B2C并使用Apple / MSAL.JS /隐式流登录-获取令牌静默失败并出现X-Frame Deny错误

问题描述

我目前正在使用React应用,该应用使用MSAL.js来向我在Azure B2C中注册的Apple身份提供商进行身份验证。我的实现基于指南:Post-GA Revisit of “Sign In with Apple” for Azure AD B2C

一切正常,但访问令牌请求例外,我尝试在登录后以静方式获取。我目前在iFrame msal.js使用的XFrame拒绝错误中回退到一个acquiretokenRedirect,它要求用户再次登录(不是很好的用户体验),然后它可以工作。

浏览器控制台出现错误

拒绝显示'https://appleid.apple.com/auth/authorize?client_id=com.my.clientid&redirect_uri=https://myb2ctenant.b2clogin.com%2foauth2%2fauthresp&response_type=code&scope=email&response_mode=form_post&nonce=nonce&state在框架中= StateProperties%3drandomCharshere”,因为它将“ x-frame-options”设置为“ deny”。

不幸的是,Apple关于隐式流及其端点的文档有限。

我的两个问题是:

  1. 我想知道隐藏的iFrame技术是否无法通过Apple登录来静获取令牌。有人成功实现了吗?

  2. 我知道与其他身份提供者(例如Google)面对这个确切的X-Frame拒绝问题时,您可以将login_hint传递到AcquisitionTokenSilent请求中,从而可以跳过交互(例如,如果用户有多个帐户并获得到iFrame中的帐户选择屏幕)。尽管我没有成功地将各种要求作为login_hint传递给Apple Provider(并且似乎不存在任何文档)。

解决方法

这是msal.js中的一个已知问题,原因是浏览器扩展cookie阻止程序/浏览器中禁用了第三方cookie。

要解决此问题,MSAL.js v2在大多数情况下通过使用auth代码流而不是隐式流来缓解此问题。请参阅this文档

,

续订请求

您应该在续订请求中发送 prompt = none ,以防止登录页面尝试呈现在iframe上,就像我的Token Renewal博客文章一样。

苹果Cookie限制

您可能还遇到了Safari跨站点Cookie限制,如我的Token Renewal Problems帖子顶部所述。如果是这样,请查看更改浏览器默认设置是否会影响行为。

可能的解决方案

使用某种形式的刷新令牌(在浏览器中或包装在cookie中)可能是可行的方法,而不是基于iframe的续订。