我对这一切的工作原理有点困惑。
我已经在我的原生iOS应用程序中实现了与苹果的登录,登录成功后,我会保存苹果提供的所有信息,如IdentityToken
、UserId
和authorization
代码。
已经审查过了,我们必须使用Apple REST API Revoke Tokens登录来实现Revoke token API端点,但我不清楚哪个是client_id
,什么是client_secret
,什么是令牌。
根据我的理解。
client_id
是捆绑包ID吗?client_secret
是苹果在登录过程中提供的identityToken
吗?。。我刚刚存储了这个令牌并将其共享到我们的服务器,但收到了invalid_client错误
如果有人能解释我应该如何处理Apple流登录期间提供的信息(UserId、IdentityToken和AuthorizationCode),以便正确实现Revoke Tokens API,我将不胜感激。
在做了一些研究并花了几个小时后,了解流程。
需要注意的是,在我的情况下,我已经在原生iOS应用程序中实现了苹果登录选项。
以下是吊销令牌需要遵循的三个重要步骤。
- 从Apple登录(客户端)获取
authorizationCode
- 通过auth\token(服务器端)使用
authorizationCode
获取刷新令牌或无到期时间的访问令牌 - 通过token\Revoke(服务器端)吊销刷新令牌或访问令牌
客户端(应用程序端):
- 从Apple登录获取
authorizationCode
-
成功登录应用程序后,您将从苹果本机didCompleteWithAuthorization委托调用中获得授权代码。
-
收到授权代码后,您需要立即将代码发送到服务器,因为该代码仅供一次使用,有效期为五分钟。
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential { let authorizationCode = String(data: appleIDCredential.authorizationCode!, encoding: .utf8)! } }
服务器端(后端):
- 使用
-
一旦从客户端收到授权代码,您将需要通过auth\token验证此代码。
-
向验证服务器(Apple服务器)发送授权请求时,请包含以下表单数据参数。
-
CCD_ 12=";com.demo.app";(您的应用程序捆绑包id)
-
client_secret
=一个由开发人员生成的秘密JSON Web令牌,它使用与您的开发人员帐户关联的苹果私钥登录。 -
code
=发送到您的应用的授权响应中收到的授权码 -
重要信息:创建客户端机密(
client_secret
)从苹果开发者文档中获取参考。-
JSON Web令牌(JWT)是一个开放标准(RFC 7519),定义了一种安全传输信息的方法。登录苹果需要JWT对每个验证请求进行授权。创建令牌,然后使用从Apple Developer下载的私钥进行签名。
-
生成签名JWT:
-
- 创建JWT标头
-
- 创建JWT有效载荷
-
- 签署JWT
-
-
要创建JWT,请在JWT标头中使用以下字段和值:
alg-->用于对令牌进行签名的算法。对于使用Apple登录,请使用ES256。
孩子->为使用与您的开发者帐户关联的Apple私钥登录生成的10个字符的密钥标识符。
- JWT有效负载包含特定于使用Apple REST API登录和客户端应用程序的信息,如颁发者、主题和过期时间。在有效载荷中使用以下声明:
是-->使用与您的开发人员帐户关联的10个字符的团队ID。
iat-->在注册时发布的声明表示您生成客户端机密的时间,以自Epoch以来的秒数表示,以UTC为单位。
exp-->过期时间注册声明标识客户端机密过期的时间。该值不得大于服务器上"当前UNIX时间"的15777000(6个月,以秒为单位)。
aud-->https://appleid.apple.com.
子->使用与
client_id
相同的值。该值区分大小写。(应用程序捆绑包id)。 -
-
创建JWT后,使用带有p-256曲线的椭圆曲线数字签名算法(ECDSA)和SHA-256哈希算法对其进行签名。解码后的
client_secret
JWT令牌具有以下格式:{ "alg": "ES256", "kid": "AEBD123DEPG" } { "iss": "EED153GJIJ", "iat": 1437179036, "exp": 1493298100, "aud": "https://appleid.apple.com", "sub": "com.demo.app" }
-
服务器验证刷新令牌后,端点返回身份令牌和访问令牌。以下是刷新令牌验证响应的示例:
{ "access_token": "beg3456...67Or9", "token_type": "Bearer", "expires_in": 3600, "id_token": "eyPgkk...96sZg" }
通过token\Revoke(服务器端)撤销刷新令牌或访问令牌
-
为了撤销用户的授权,您必须获得在步骤(2)中获得的有效刷新令牌或访问令牌。
-
一旦您有了有效的刷新或
access_token
,您就可以通过token\revoke端点撤销令牌。 -
服务器需要以下参数才能使令牌无效。
-
CCD_ 19=";com.demo.app";(您的应用程序捆绑包id)
-
CCD_ 20=";一个秘密的JSON Web令牌,与您在步骤2中生成的方式相同;。
-
token
=access_token
,这是您从步骤2的端点调用中得到的。
一旦访问令牌撤销,客户端就会收到相同的通知,因为该客户端需要添加下面的观察者。
func addObserverforRevokeAppleSignToken() {
let sessionNotificationName = ASAuthorizationAppleIDProvider.credentialRevokedNotification
NotificationCenter.default.addObserver(forName: sessionNotificationName, object: nil, queue: nil) { (notification: Notification) in
// Sign user out
print("Apple sign in token revoked....")
}
}
您可以查看设置-密码&安全性>使用Apple ID的应用程序
谢谢。
基于文档Revoke Tokens:
client_id
-应用程序的标识符(应用程序ID或服务ID)client_secret
-一个秘密的JSON Web令牌(JWT),它使用与您的开发人员帐户关联的苹果私钥登录。有关创建客户端机密的更多信息,请参阅生成和验证令牌token
-打算撤销的用户刷新令牌或访问令牌。如果请求成功,则撤销与所提供的令牌相关联的用户会话
client_id
我不是100%确定,但值得尝试以下内容:
- 转到https://appstoreconnect.apple.com
- 选择
My Apps
- 选择你的应用
- 在边栏上选择
App Information
- 您将看到
Apple ID
(10位数字id)
尝试使用此10位id作为client_id