在做了一些研究并花了几个小时之后,理解了流程.
请注意,在我的例子中,我已经在原生iOS应用程序中实现了苹果登录选项.
以下是撤销令牌需要遵循的三个重要步骤.
- 从苹果登录(client side)获得
authorizationCode
.
- 使用
authorizationCode
到auth\token (server side)获取没有到期时间的刷新令牌或访问令牌.
- 通过token\revoke (server side)撤销刷新令牌或访问令牌.
Client Side(App side):个
- 从苹果登录获得
authorizationCode
美元.
成功登录应用程序后,您将从Apple原生的didCompleteWithAuthorization委托调用中获得授权码.
当您收到授权码时,您需要立即将代码发送到服务器,因为代码只有一次使用,有效期为五分钟.
func authorizationController(controller: ASAuthorizationController,
didCompleteWithAuthorization authorization: ASAuthorization) {
if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
let authorizationCode = String(data: appleIDCredential.authorizationCode!, encoding: .utf8)!
}
}
Server side (backend side):个
- 使用以下命令获取无过期时间的刷新令牌或访问令牌
一旦从客户端收到授权码,您将需要通过auth\token验证该代码.
当您向验证服务器(Apple服务器)发送授权请求时,请包括以下表单数据参数.
client_id
="com.demo.app"(您的应用包ID)
client_secret
=由开发人员生成的秘密JSON Web令牌,它使用与您的开发人员帐户关联的Apple私钥登录.
code
=在发送到您的应用程序的授权响应中收到的授权码
Important:创建客户端机密(client_secret
)从Apple开发人员文档中获取参考.
alg-->;用于对令牌签名的算法.要登录苹果,请使用ES256.
kid-->;使用与您的开发人员帐户关联的Apple私钥为登录生成的10个字符的密钥标识符.
- JWT有效负载包含特定于使用Apple REST API登录和客户端应用程序的信息,如颁发者、主题和到期时间.在有效负载中使用以下索赔:
is-->;使用与您的开发人员帐户关联的10个字符的团队ID.
iat-->;在注册索赔处发布的声明指示您生成客户端机密的时间,以自纪元以来的秒数为单位,以UTC为单位.
exp-->;过期时间注册声明标识客户端机密过期或之后的时间.该值不得大于服务器上当前Unix时间的15777000(6个月,以秒为单位).
aud->;https://appleid.apple.com.
sub-->;使用与client_id
相同的值.该值区分大小写.(应用程序Bundle 包ID).
创建JWT后,使用带有P-256曲线和SHA-256散列算法的椭圆曲线数字签名算法(ECDSA)对其进行签名.解码的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"
}
Revoke the refresh token or access token through 100 (server side).
为了撤销对用户的授权,您必须获得在步骤(2)中获得的有效刷新令牌或访问令牌.
一旦您有了有效的更新或access_token
,您将能够通过token\revoke端点撤销令牌.
服务器需要以下参数才能使令牌无效.
client_id
="com.demo.app"(您的应用包ID)
client_secret
="您在步骤2中生成的秘密JSON Web令牌".
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查看设置-密码&安全&>应用程序.
谢谢.