我对这一切是如何运作的有点困惑.

我已经实现了登录苹果在我的本地iOS应用程序,我确实保存了苹果提供的所有信息一旦登录成功,如IdentityToken,UserIdauthorization代码.

我已经看过了,我们必须使用Sign in with Apple REST API Revoke Tokens来实现撤销令牌API端点,只是我不清楚哪一个是client_id,什么是client_secret,以及什么是令牌.

据我所知.

Bundle 包ID是client_id吗? client_secret是苹果在签到过程中提供的identityToken吗?我刚刚将此内标识存储并共享到我们的服务器,但收到了INVALID_CLIENT错误

如果有人能解释一下我应该如何处理Apple Flow登录过程中提供的信息(UserID、IdentityToken和AuthorizationCode),以便正确实现撤销令牌API,我将非常感激.

推荐答案

在做了一些研究并花了几个小时之后,理解了流程.

请注意,在我的例子中,我已经在原生iOS应用程序中实现了苹果登录选项.

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

  1. 从苹果登录(client side)获得authorizationCode.
  2. 使用authorizationCodeauth\token (server side)获取没有到期时间的刷新令牌或访问令牌.
  3. 通过token\revoke (server side)撤销刷新令牌或访问令牌.

Client Side(App side):

  1. 从苹果登录获得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):

  1. 使用以下命令获取无过期时间的刷新令牌或访问令牌
  • 一旦从客户端收到授权码,您将需要通过auth\token验证该代码.

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

  • client_id="com.demo.app"(您的应用包ID)

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

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

  • Important:创建客户端机密(client_secret)从Apple开发人员文档中获取参考.

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

    • 要生成签名的JWT,请执行以下操作:

        1. 创建JWT标头.
        1. 创建JWT负载.
        1. 签署JWT.
    • 要创建JWT,请在JWT标题中使用以下字段和值:

    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查看设置-密码&安全&>应用程序.

谢谢.

Ios相关问答推荐

使用UIGraphicsBeginIMAext创建新图像会扭曲图像 colored颜色

Xcode版本15.2上未显示iOS 16.4的模拟器

如何修复使用EFCore和SQLite的.Net MAUI iOS应用程序上的当前应用程序不支持NullabilityInfoContext?

为什么导航栏在与Style.Page的选项卡栏一起使用时停止工作?

与iPadOS中带有扣件的模式相似的组件是什么?

设置托管在DigitalOcean上的iOS通用链接

有没有办法将滚动视图RTL(阿拉伯语)与Ltr动画一起使用?

圆角矩形路径上的蛇形动画

Text() 正在添加额外的前导尾随填充 SwiftUI

clipShape swift的三元

如何在不支持并发的自动关闭中修复'async'调用?

try 在 iOS 中分发 Flutter 应用程序时出现Invalid Provisioning Profile Signature错误

通过touch 传递到下面的 UIViews

如何在导航栏右侧添加多个 UIBarButtonItem?

刷新由 Xcode 7 管理的团队配置文件中的设备?

Swift 将 unix 时间转换为日期和时间

自动布局:是什么创建了名为 UIView-Encapsulated-Layout-Width & Height 的约束?

iOS:设备旋转后如何运行函数(Swift)

在 iOS 上编写文件

如何在 iphone 屏幕中间显示活动指示器?