在我的移动应用程序上,我使用apple id授权。我的实现使用ASAuthorizationAppleIdProvider
类,不需要额外的代理web应用程序,它会向Apple发送请求。所有交互都在移动客户端上完成。
一切正常,我获得了授权,并从苹果获得了IdentityToken。
现在,我想把这个IdentityToken(看起来像"AjzN91mNajN3401jazOs001m3ks"(发送到服务器。在服务器端,我想从这个令牌中提取用户的电子邮件。
为了让谷歌解决同样的任务,我必须用令牌发送GET请求,就像一样
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=google_token
如果令牌作为响应是有效的,我会得到里面有用户电子邮件的JSON。
如何使用苹果的身份密钥对苹果进行同样的操作?
更新#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端点和什么HTTP请求(GET、POST(来完成此任务
在OpenID Connect中,身份令牌从不发送到提供者。我认为这只是一个拼写错误/命名问题,你指的是访问令牌。
用户身份验证的最终结果是两个令牌:
- 访问令牌,这是一种不透明的令牌,客户端不会对其进行内省。它可能是JWT,也可能不是JWT
- 一个ID令牌,一个包含用户声明的JWT
若要获取用户的电子邮件地址,请解码ID/Identity Token的JWT有效载荷。要在Swift中执行此操作,请参阅以下SO答案。JWT应包含一个email
值。看起来电子邮件地址也可能是ASAuthorizationAppleIdProvider
的实例属性,所以您应该能够从credentials.email
获取它们。
似乎没有直接验证访问令牌的方法。大多数OpenID Connect提供商都提供Userinfo端点或Token Instrospection端点(我认为这是有问题的谷歌端点(,但苹果没有。然而,已经执行了许多步骤来获得访问令牌,这将使其无法伪造。不过,如果你真的只想要电子邮件地址,JWT是加密签名的,所以验证JWT应该可以保证它是由苹果发布的。您也可以验证刷新令牌,如Apple Developer文档中所示。在您上面的代码中,我看不到访问Refresh Token的方法,但如果您遵循此处或此处教程中所示的替代流程,您将能够访问。