尝试从apple获取transfer_sub,但获得invalid_request



我正在尝试转移使用" Sign in with apple ";将您的应用程序和用户转移到另一个团队

我得到访问令牌非常好,但当我试图获得transfer_sub时,我总是得到invalid_request。我很确定我提供的参数是正确的。我关心的是步骤的顺序。

这里苹果特别说:

作为为接收方团队准备数据的一部分,您需要在启动传输之前为数据库中的所有用户生成传输标识符。

另一方面,这个答案说:

不能使用api "/auth/usermigrationinfo">

在苹果开发者论坛有一个开放的问题,但是没有答案。

最后我的问题是:

  1. 转送前后应做哪些步骤?
  2. 我可以得到transfer_sub为每个用户发送请求/usermigrationinfo与旧团队的client_secret,即使在转移后?

获取传输Id(在文档中称为transfer_sub)有点棘手,但您可以提取它。步骤如下:

  1. 在Apple登录后获取身份令牌:

    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
    if let identityTokenData = appleIDCredential.identityToken {
    let identityToken = String(data: identityTokenData, encoding: .utf8)
    // this is explained on the next step
    if let transferId = decodeIDTokenAndExtractTransferId(identityToken) {
    print("Transfer ID: (transferId)")
    }
    }
    }
    }
    
  2. 然后,我们使用身份令牌对其进行解码,并使用以下逻辑提取包含传输id的JSON:

    func decodeIDTokenAndExtractTransferId(_ idToken: String?) -> String? {
    guard let idToken = idToken else {
    return nil
    }
    let components = idToken.components(separatedBy: ".")
    guard components.count == 3 else {
    return nil
    }
    let payloadBase64 = components[1]
    guard let payloadData = base64UrlDecode(payloadBase64) else {
    return nil
    }
    do {
    if let json = try JSONSerialization.jsonObject(with: payloadData, options: []) as? [String: Any] {
    return json["transfer_sub"] as? String
    }
    } catch {
    print("Error decoding ID token: (error.localizedDescription)")
    }
    return nil
    }
    func base64UrlDecode(_ base64Url: String) -> Data? {
    var base64 = base64Url
    .replacingOccurrences(of: "-", with: "+")
    .replacingOccurrences(of: "_", with: "/")
    let remainder = base64.count % 4
    if remainder > 0 {
    base64.append(String(repeating: "=", count: 4 - remainder))
    }
    return Data(base64Encoded: base64)
    }
    

这个JSON里面有以下几个键,你可以从中得到你需要的值:

iss, sub, aud, iat, exp, nonce, nonce_supported, email, email_verified, is_private_email, real_user_status,transfer_sub

你可以在这里阅读他们每个人的工作。

相关内容

  • 没有找到相关文章

最新更新