1

我正在尝试在网络上使用 Apple 对用户进行身份验证(这是必需的,因为我们还有一个 iOS 应用程序并有一个使用 Facebook 登录选项,我们也必须使用 Apple 登录,否则 Apple 会拒绝我们在 iOS 端的应用程序更新)这是我的元标记(敏感信息已编辑),如 Apple 的示例所示:

<meta name="appleid-signin-client-id" content="com.myapp">
<meta name="appleid-signin-scope" content="name email">
<meta name="appleid-signin-redirect-uri" content="https://my.return.url">
<meta name="appleid-signin-state" content="x login">
<meta name="appleid-signin-nonce" content="some number">
<meta name="appleid-signin-use-popup" content="false">

当用户点击按钮时,它会要求正确共享姓名和/或电子邮件:

在此处输入图像描述

我继续,并按预期调用了我的重定向 URL。但是,当我解码返回的内容时,除了与 JWT 相关的字段外,id_token我只看到emailemail_verified字段。我没有任何与用户名相关的信息。我知道名称字段仅在第一次身份验证时填充,因此这是在从“使用 Apple ID 的应用程序和网站”页面从我的 Apple ID 中删除我的应用程序后重新登录后。如果我将appleid-signin-scope元标记更改为name我也不会收到电子邮件,那么这个值就会以某种方式得到尊重。我也没有触及屏幕截图中有关名称字段的任何内容(我可以通过 Touch ID 进行操作,甚至无需单击任何内容)但是id_token只能有email,不能有名字。除了电子邮件之外,我还需要获取用户的姓名才能完成注册,并且我不得不添加“使用 Apple 登录”选项以将任何更新推送到我的 iOS 应用程序。许多人报告说他们只是第一次得到这个名字(正如苹果明确指出的那样),但我什至第一次都没有得到它。

我究竟做错了什么?

4

2 回答 2

1

不幸的是,这似乎是不可能的。但是,该名称在来自“授权”端点的响应正文中以 JSON 形式返回,并与 id 令牌一起返回。这仅在用户第一次登录时可用,当他们同意您的应用程序访问他们的姓名和电子邮件地址时,而不是在后续登录时。

Apple 文档 - 检索用户信息

如果您请求用户的全名,Sign in with Apple 会收集信息以传递给您的应用程序。该名称默认为用户 Apple ID 中的名称,但用户可以更改其名称。修改后的名称仅与您的应用共享,而不与 Apple 共享,因此不包含在 ID 令牌中。

来自“https://appleid.apple.com/auth/authorize”的响应,包括“用户”对象:

{
  "code": "AUTH_CODE",
  "id_token": "ID_TOKEN",
  "user": {
    "name": {
      "firstName": "Jeb",
      "lastName": "Kerman"
    },
    "email": "jeb.kerman@apple.com"
  }
}

Apple 文档 - 处理授权响应

于 2022-01-17T16:47:42.630 回答
0

代码需要请求UserI属性,如Sign in with Apple API文档中所述。

样本:

<meta name="appleid-signin-client-id" content="com.myapp">
<meta name="appleid-signin-scope" content="UserI">
<meta name="appleid-signin-redirect-uri" content="https://my.return.url">
<meta name="appleid-signin-state" content="x login">
<meta name="appleid-signin-nonce" content="some number">
<meta name="appleid-signin-use-popup" content="false">

文档图片

于 2021-03-13T19:38:59.223 回答