使用 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 问题,您指的是访问令牌。
用户认证的最终结果是两个令牌:
- 访问令牌,一个不透明的令牌,不应该被客户端检查。它可能是也可能不是 JWT。
- 一个 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,您将能够。
在我的移动应用程序上,我使用 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 问题,您指的是访问令牌。
用户认证的最终结果是两个令牌:
- 访问令牌,一个不透明的令牌,不应该被客户端检查。它可能是也可能不是 JWT。
- 一个 ID 令牌,一个包含用户声明的 JWT。
要获取用户的电子邮件地址,请解码 ID/Identity 令牌的 JWT 负载。要在 Swift 中执行此操作,请参阅 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,您将能够。