撤销帐户删除过程中的 Apple 登录令牌

Rah*_*l D 3 authentication ios jwt swift

我\xe2\x80\x99m 对这一切是如何工作的有点困惑。

\n

我\xe2\x80\x99已经在我的本机iOS应用程序中实现了Sign In with Apple,我确实保存了登录成功后Apple提供的所有信息,例如IdentityToken,,UserIdauthorization代码。

\n

已经审查过,我们必须使用使用Apple REST API 撤销令牌登录来实现撤销令牌 API 端点,只是我不清楚哪个client_id,什么是client_secret,以及令牌是什么。

\n

据我的理解。

\n

client_id捆绑包 ID 是否正确?\nApple在登录过程中是否提供了该 ID?...我刚刚存储此令牌并将其共享到我们的服务器,但收到 invalid_clientclient_secret错误identityToken

\n

如果有人可以解释我应该如何处理使用 Apple 登录流程(UserId、IdentityToken 和 AuthorizationCode)期间提供的信息,以便正确实现撤销令牌 API,我将非常感激。

\n

Rah*_*l D 8

经过一些研究并花费几个小时后,了解流程。

\n

请注意,在我的例子中,我\xe2\x80\x99已经在本机iOS应用程序中实现了苹果登录选项。

\n

以下是撤销令牌需要遵循的三个重要步骤。

\n
    \n
  1. authorizationCode从Apple登录(客户端)获取。
  2. \n
  3. authorizationCode使用auth\\token (服务器端)获取没有到期时间的刷新令牌或访问令牌。
  4. \n
  5. 通过token\\revoke (服务器端)撤销刷新令牌或访问令牌。
  6. \n
\n

客户端(应用程序端):

\n
    \n
  1. authorizationCode从苹果登录获取。
  2. \n
\n
    \n
  • 成功登录应用程序后,您将从苹果本机 didCompleteWithAuthorization 委托调用中获取授权码。

    \n
  • \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 }\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

服务器端(后端):

\n
    \n
  1. 使用以下命令获取没有过期时间的刷新令牌或访问令牌
  2. \n
\n
    \n
  • 从客户端收到授权码后,您需要通过auth\\token验证此代码。

    \n
  • \n
  • 当您向验证服务器(Apple 服务器)发送授权请求时,请包含以下表单数据参数。

    \n
  • \n
  • client_id=“com.demo.app”(您的应用程序包 ID)

    \n
  • \n
  • client_secret= 由开发人员生成的秘密 JSON Web 令牌,它使用与您的开发人员帐户关联的 Apple 私钥登录。

    \n
  • \n
  • code= 发送到您的应用程序的授权响应中收到的授权代码

    \n
  • \n
  • 重要提示:创建客户端密钥 ( client_secret) 从 APPLE 开发人员文档中获取参考。

    \n
      \n
    • JSON Web Token (JWT) 是一种开放标准 (RFC 7519),定义了一种安全传输信息的方式。使用 Apple 登录需要 JWT 来授权每个验证请求。创建令牌,然后使用您从 Apple Developer 下载的私钥对其进行签名。

      \n
    • \n
    • 要生成签名的 JWT:

      \n
        \n
      • \n
          \n
        1. 创建 JWT 标头。
        2. \n
        \n
      • \n
      • \n
          \n
        1. 创建 JWT 有效负载。
        2. \n
        \n
      • \n
      • \n
          \n
        1. 签署 JWT。
        2. \n
        \n
      • \n
      \n
    • \n
    • 要创建 JWT,请在 JWT 标头中使用以下字段和值:

      \n
    • \n
    \n

    alg --> 用于签署令牌的算法。对于使用 Apple 登录,请使用 ES256。

    \n

    Kid --> 为与您的开发者帐户关联的“使用 Apple 私钥登录”生成的 10 个字符的密钥标识符。

    \n
      \n
    • JWT 负载包含特定于使用 Apple REST API 登录和客户端应用程序的信息,例如颁发者、主题和过期时间。在有效负载中使用以下声明:
    • \n
    \n

    --> 使用与您的开发者帐户关联的 10 个字符的团队 ID。

    \n

    iat --> 注册声明中的发布表示您生成客户端密钥的时间,以自纪元以​​来的秒数表示,采用 UTC。

    \n

    exp --> 注册声明的过期时间标识客户端密钥过期的时间或之后的时间。该值不得大于服务器上当前 UNIX 时间的 15777000(6 个月,以秒为单位)。

    \n

    aud --> https://appleid.apple.com

    \n

    sub --> 使用与 相同的值client_id。该值区分大小写。(应用程序包 ID)。

    \n
  • \n
  • 创建 JWT 后,使用椭圆曲线数字签名算法 (ECDSA)、P-256 曲线和 SHA-256 哈希算法对其进行签名。解码后的client_secretJWT 令牌具有以下格式:

    \n
     {\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 }\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 服务器验证刷新令牌后,端点返回身份令牌和访问令牌。以下是刷新令牌验证响应示例:

    \n
     {\n   "access_token": "beg3456...67Or9",\n   "token_type": "Bearer",\n   "expires_in": 3600,\n   "id_token": "eyPgkk...96sZg"\n }\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

通过token\\revoke (服务器端)撤销刷新令牌或访问令牌。

\n
    \n
  • 为了撤销用户的授权,您必须获取在步骤 (2) 中获得的有效刷新令牌或访问令牌。

    \n
  • \n
  • 一旦您进行了有效的刷新,或者access_token您将能够通过token\\revoke端点撤销令牌。

    \n
  • \n
  • 服务器使令牌失效需要以下参数。

    \n
  • \n
  • client_id=“com.demo.app”(您的应用程序包 ID)

    \n
  • \n
  • client_secret=“与您在步骤 2 中生成的方式相同的秘密 JSON Web 令牌”。

    \n
  • \n
  • token=access_token这是您从第 2 步端点调用中获得的结果。

    \n
  • \n
\n

一旦访问令牌被撤销,客户端就会收到相同的通知,因为该客户端需要添加下面的观察者。

\n
func 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}\n
Run Code Online (Sandbox Code Playgroud)\n

您可以检查设置 - 密码和安全 > 使用 Apple ID 的应用程序。

\n

谢谢。

\n

  • 我收到 200 OK,但我的应用程序并未从授权应用程序列表中删除。你怎么看待这件事? (2认同)