我正在尝试转移使用" Sign in with apple ";将您的应用程序和用户转移到另一个团队
我得到访问令牌非常好,但当我试图获得transfer_sub时,我总是得到invalid_request。我很确定我提供的参数是正确的。我关心的是步骤的顺序。
这里苹果特别说:
作为为接收方团队准备数据的一部分,您需要在启动传输之前为数据库中的所有用户生成传输标识符。
另一方面,这个答案说:
不能使用api "/auth/usermigrationinfo">
在苹果开发者论坛有一个开放的问题,但是没有答案。
最后我的问题是:
- 转送前后应做哪些步骤?
- 我可以得到transfer_sub为每个用户发送请求/usermigrationinfo与旧团队的client_secret,即使在转移后?
获取传输Id(在文档中称为transfer_sub
)有点棘手,但您可以提取它。步骤如下:
-
在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)") } } } }
-
然后,我们使用身份令牌对其进行解码,并使用以下逻辑提取包含传输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
你可以在这里阅读他们每个人的工作。