Rah*_*l D 3 authentication ios jwt swift
我\xe2\x80\x99m 对这一切是如何工作的有点困惑。
\n我\xe2\x80\x99已经在我的本机iOS应用程序中实现了Sign In with Apple,我确实保存了登录成功后Apple提供的所有信息,例如IdentityToken,,UserId和authorization代码。
已经审查过,我们必须使用使用Apple REST API 撤销令牌登录来实现撤销令牌 API 端点,只是我不清楚哪个client_id,什么是client_secret,以及令牌是什么。
据我的理解。
\nclient_id捆绑包 ID 是否正确?\nApple在登录过程中是否提供了该 ID?...我刚刚存储此令牌并将其共享到我们的服务器,但收到 invalid_clientclient_secret错误identityToken
如果有人可以解释我应该如何处理使用 Apple 登录流程(UserId、IdentityToken 和 AuthorizationCode)期间提供的信息,以便正确实现撤销令牌 API,我将非常感激。
\n经过一些研究并花费几个小时后,了解流程。
\n请注意,在我的例子中,我\xe2\x80\x99已经在本机iOS应用程序中实现了苹果登录选项。
\n以下是撤销令牌需要遵循的三个重要步骤。
\nauthorizationCode从Apple登录(客户端)获取。authorizationCode使用auth\\token (服务器端)获取没有到期时间的刷新令牌或访问令牌。客户端(应用程序端):
\nauthorizationCode从苹果登录获取。成功登录应用程序后,您将从苹果本机 didCompleteWithAuthorization 委托调用中获取授权码。
\n当您收到授权代码时,您需要立即将代码发送到服务器,因为该代码仅供使用一次,有效期为五分钟。
\n func authorizationController(controller: ASAuthorizationController,\ndidCompleteWithAuthorization authorization: ASAuthorization) {\n\n if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {\n let authorizationCode = String(data: appleIDCredential.authorizationCode!, encoding: .utf8)!\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n服务器端(后端):
\n从客户端收到授权码后,您需要通过auth\\token验证此代码。
\n当您向验证服务器(Apple 服务器)发送授权请求时,请包含以下表单数据参数。
\nclient_id=“com.demo.app”(您的应用程序包 ID)
client_secret= 由开发人员生成的秘密 JSON Web 令牌,它使用与您的开发人员帐户关联的 Apple 私钥登录。
code= 发送到您的应用程序的授权响应中收到的授权代码
重要提示:创建客户端密钥 ( client_secret) 从 APPLE 开发人员文档中获取参考。
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),定义了一种安全传输信息的方式。使用 Apple 登录需要 JWT 来授权每个验证请求。创建令牌,然后使用您从 Apple Developer 下载的私钥对其进行签名。
\n要生成签名的 JWT:
\n要创建 JWT,请在 JWT 标头中使用以下字段和值:
\nalg --> 用于签署令牌的算法。对于使用 Apple 登录,请使用 ES256。
\nKid --> 为与您的开发者帐户关联的“使用 Apple 私钥登录”生成的 10 个字符的密钥标识符。
\n是--> 使用与您的开发者帐户关联的 10 个字符的团队 ID。
\niat --> 注册声明中的发布表示您生成客户端密钥的时间,以自纪元以来的秒数表示,采用 UTC。
\nexp --> 注册声明的过期时间标识客户端密钥过期的时间或之后的时间。该值不得大于服务器上当前 UNIX 时间的 15777000(6 个月,以秒为单位)。
\naud --> https://appleid.apple.com。
\nsub --> 使用与 相同的值client_id。该值区分大小写。(应用程序包 ID)。
创建 JWT 后,使用椭圆曲线数字签名算法 (ECDSA)、P-256 曲线和 SHA-256 哈希算法对其进行签名。解码后的client_secretJWT 令牌具有以下格式:
{\n "alg": "ES256",\n "kid": "AEBD123DEPG"\n }\n\n { \n "iss": "EED153GJIJ",\n "iat": 1437179036,\n "exp": 1493298100,\n "aud": "https://appleid.apple.com",\n "sub": "com.demo.app"\n }\nRun Code Online (Sandbox Code Playgroud)\n服务器验证刷新令牌后,端点返回身份令牌和访问令牌。以下是刷新令牌验证响应示例:
\n {\n "access_token": "beg3456...67Or9",\n "token_type": "Bearer",\n "expires_in": 3600,\n "id_token": "eyPgkk...96sZg"\n }\nRun Code Online (Sandbox Code Playgroud)\n通过token\\revoke (服务器端)撤销刷新令牌或访问令牌。
\n为了撤销用户的授权,您必须获取在步骤 (2) 中获得的有效刷新令牌或访问令牌。
\n一旦您进行了有效的刷新,或者access_token您将能够通过token\\revoke端点撤销令牌。
服务器使令牌失效需要以下参数。
\nclient_id=“com.demo.app”(您的应用程序包 ID)
client_secret=“与您在步骤 2 中生成的方式相同的秘密 JSON Web 令牌”。
token=access_token这是您从第 2 步端点调用中获得的结果。
一旦访问令牌被撤销,客户端就会收到相同的通知,因为该客户端需要添加下面的观察者。
\nfunc addObserverforRevokeAppleSignToken() {\n let sessionNotificationName = ASAuthorizationAppleIDProvider.credentialRevokedNotification\n NotificationCenter.default.addObserver(forName: sessionNotificationName, object: nil, queue: nil) { (notification: Notification) in\n // Sign user out\n print("Apple sign in token revoked....")\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n您可以检查设置 - 密码和安全 > 使用 Apple ID 的应用程序。
\n谢谢。
\n