我们如何信任来自 Apple 登录的用户信息,当它不包含在 id_token 中时,完整性可以通过 Apple 的公钥验证

问题描述 投票:0回答:1

在这里接受的回复https://developer.apple.com/forums/thread/118209写了

To request user information in the id_token...
但事实并非如此,用户信息永远不会在id_token中而是作为standalnoe未签名的“用户”参数并且紧随其后从 https://appleid.apple.com/auth/authorize 重定向到 redirect_uri 后,第一次登录(好吧,Apple 只决定了一次,并且像 Apple 一样让开发人员的生活变得复杂)在授权时,我们还设置了“response_type” => 'code id_token' + 'scope' => 'name email' 但用户信息不包含在解码的 id_token 中,而是作为单独的参数“用户”...

  POST params Array
  (
    [state] => ...
    [code] => ...
    [id_token] => eyJr...UUg
    [user] => {"name":{"firstName":"...","lastName":"..."},"email":"..."}
  )

安全性如何?我们如何信任用户参数中的字段? Email,OK,它也包含在id_token中,我们可以通过签名和Appples公钥来验证。用户可以停止请求(例如关闭互联网),可以修改请求中的“用户”帖子字段并将其发送给开发人员。

我尝试使用提供的“代码”参数请求 https://appleid.apple.com/auth/token 但用户信息不可用。可以信任响应,但用户信息不可用。不能直接作为“用户”参数使用,也不能在 id_token 中再次使用。

oauth-2.0 jwt apple-sign-in
1个回答
0
投票

Apple 的实施似乎存在一些未解决的问题,正如您所指出的。

一个潜在的可靠性问题是 Apple 如何仅在第一次返回姓名和电子邮件详细信息。如果应用程序在保存此数据时遇到问题,则默认情况下不会再次收到数据,您也无法恢复。

我会通过某种自定义注册或提示新用户输入个人信息的欢迎屏幕来处理这个问题。这可能包括您需要存储在身份数据中但在 Apple 中不存在的其他信息,例如国家/地区。您还可以使用它来忽略来自 Apple 的任何您无法验证的

user
数据。

授权服务器

理想情况下,我还建议使用授权服务器来管理与 Apple 的连接。然后可以在那里存储/管理用户帐户数据和任何自定义屏幕,您无需在应用程序代码中处理提供商特定的行为。

然后,您的应用程序将仅使用标准的 OpenID Connect,并且除了 Apple 之外,您还可以通过许多其他方式对用户进行身份验证。这就是 OAuth 的想法:更改身份验证的工作方式应该需要对您的应用程序进行零代码更改。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.