使用 Apple 的 IdentityToken 获取用户的电子邮件

Obtaining user's email using Apple's IdentityToken

在我的移动应用程序上,我使用 apple-id 授权。我的实现使用 ASAuthorizationAppleIdProvider class 并且不需要向 Apple 发送请求的额外代理 Web 应用程序。所有交互都在移动客户端上完成。

一切正常,我获得授权并从 Apple 获得 IdentityToken。

现在,我想将此 IdentityToken(看起来像“AjzN91mNajN3401jazOs001m3ks”)发送到服务器。在服务器端,我想从此令牌中提取用户的电子邮件。

为了 Google 解决相同的任务,我必须发送带有令牌的 GET 请求,就像那样

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=google_token

如果令牌在响应中有效,我会收到 JSON,其中包含用户的电子邮件。

如何使用 Apple 的身份密钥为 Apple 做同样的事情?


更新#1:

我的项目有两部分,客户端部分(前端)和服务器部分(后端)。

获取 IdentityToken 的功能看起来像这样(AuthManager 只是一个委托):

var provider = new ASAuthorizationAppleIdProvider();
var req = provider.CreateRequest();

authManager = new AuthManager(UIApplication.SharedApplication.KeyWindow);

req.RequestedScopes = new[] {
  ASAuthorizationScope.FullName,
  ASAuthorizationScope.Email
};
var controller = new ASAuthorizationController(new[] {
  req
}) {
  Delegate = authManager,
  PresentationContextProvider = authManager
};

controller.PerformRequests();

ASAuthorizationAppleIdCredential credentials = await authManager.Credentials;

当我获得凭据时,有 credentials.IdentityToken 属性 可用。

现在,我想把这个身份令牌发送到服务器,让服务器检查这个令牌并使用这个令牌从Apple服务器获取用户的电子邮件,就像我一样对于 Google(如上所述)。

而且我不明白,我该怎么做。

应该使用什么 Apple 端点和什么 HTTP 请求(GET,POST)来完成此任务?

在 OpenID Connect 中,身份令牌永远不会发送给提供商。我认为这只是一个 typo/naming 问题,您指的是访问令牌。

用户认证的最终结果是两个令牌:

  1. 访问令牌,一个不透明的令牌,不应该被客户端检查。它可能是也可能不是 JWT。
  2. 一个 ID 令牌,一个包含用户声明的 JWT。

要获取用户的电子邮件地址,请解码 ID/Identity 令牌的 JWT 负载。要在 Swift 中执行此操作,请参阅 . The JWT should contain an email value. It looks like the email address may also be an instance property of ASAuthorizationAppleIdProvider,因此您应该能够从 credentials.email.

中获取它们

似乎没有直接验证访问令牌的方法。大多数 OpenID Connect 提供商提供一个 Userinfo 端点或一个 Token Instrospection 端点(我认为这是相关链接的 Google 端点),但 Apple 没有。然而,已经执行了许多步骤来获取访问令牌,这应该使得它不可能被伪造。但是,如果您真的只想要电子邮件地址,则 JWT 是经过加密签名的,因此验证 JWT 应该可以保证它是由 Apple 颁发的。您还可以将刷新令牌验证为 shown in Apple Developer docs. In your code above, I don't see a way to access Refresh Token, but if you followed an alternative flow as shown in one of the tutorials here or here,您将能够。