IdentityProvider:getUserInfo() 静态方法

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

IdentityProvider 接口的 getUserInfo() 静态方法返回已登录用户的信息,可用于提供个性化的欢迎消息和登录按钮。此方法必须从 IdentityProvider 源的 <iframe> 中调用,这样 信赖方 (RP) 脚本就无法访问该数据。这必须在用户登录到 RP 网站后发生。

这种模式在使用身份联合进行登录的网站上已经很常见,但 getUserInfo() 提供了一种无需依赖 第三方 Cookie 即可实现此目的的方法。

语法

js
IdentityProvider.getUserInfo(config)

参数

config

一个配置对象,其中可以包含以下属性

configURL

要从中获取用户信息的身份提供程序的 配置文件的 URL。

clientId

IdP 发行的 RP 的客户端标识符。

返回值

一个 Promise,该 Promise 会解析为一个对象数组,每个对象都包含表示单独用户帐户的信息。每个对象都包含以下属性

电子邮件

表示用户电子邮件地址的字符串。

name

表示用户全名的字符串。

givenName

表示用户名字(昵称或缩写名)的字符串。

picture

表示用户个人资料图片的 URL 的字符串。

异常

InvalidStateError DOMException

如果提供的 configURL 无效,或者嵌入文档的原点与 configURL 不匹配,则抛出此异常。

NetworkError DOMException

如果浏览器无法连接到 IdP,或者 getUserInfo() 是从顶层文档调用的,则抛出此异常。

NotAllowedError DOMException

如果嵌入的 <iframe> 没有设置 identity-credentials-get Permissions-Policy 来允许使用 getUserInfo(),或者 FedCM API 被顶层文档上的策略全局禁用,则抛出此异常。

描述

当调用 getUserInfo() 时,只有在以下两个条件都满足时,浏览器才会向指定的 IdP 的 帐户列表端点发出请求以获取用户信息

  • 用户已通过 FedCM 在同一浏览器实例中登录到 RP,且数据未被清除。
  • 用户已在同一浏览器实例中登录到 IdP。

getUserInfo() 必须从嵌入的 <iframe> 中调用,并且嵌入站点的原点必须与 IdP 的 configURL 匹配。此外,嵌入的 HTML 必须通过 identity-credentials-get Permissions-Policy 明确允许其使用。

html
<iframe
  src="https://idp.example/signin"
  allow="identity-credentials-get"></iframe>

示例

基本 IdentityProvider.getUserInfo() 用法

以下示例演示了如何使用 IdentityProvider.getUserInfo() 方法从特定 IdP 返回之前登录过的用户的信息。

js
// Iframe displaying a page from the https://idp.example origin
const userInfo = await IdentityProvider.getUserInfo({
  configURL: "https://idp.example/fedcm.json",
  clientId: "client1234",
});

// IdentityProvider.getUserInfo() returns an array of user information.
if (userInfo.length > 0) {
  // Returning accounts should be first, so the first account received
  // is guaranteed to be a returning account
  const name = userInfo[0].name;
  const givenName = userInfo[0].given_name;
  const displayName = givenName || name;
  const picture = userInfo[0].picture;
  const email = userInfo[0].email;

  // …

  // Render the personalized sign-in button using the information above
}

规范

规范
Federated Credential Management API
# dom-identityprovider-getuserinfo

浏览器兼容性

另见