0

语境

  • 为 iOS 13.2 用 Swift 编写的 iOS 应用(不使用 Firebase iOS SDK)
  • 应用通过 REST 调用使用 Firebase 实时数据库(因此需要来自 Firebase 身份验证的 ID 令牌)

我正在尝试将我的 iOS 应用程序切换为使用 Apple 的“使用 Apple 登录”功能,以通过 Firebase 身份验证的“电子邮件/密码”登录提供程序替换简单的用户名/密码身份验证。

用户成功的“Apple 登录”将为我留下来自 Apple 的 JWT 令牌(身份令牌),例如这个(解码和编辑):

HEADER

{
  "kid": "ABCDPK1",
  "alg": "RS256"
}

BODY

{
  "iss": "https://appleid.apple.com",
  "aud": "XYZ.App",
  "exp": 1574131940,
  "iat": 1574131340,
  "sub": "01234.1234561ecd054cd285d65cc7af261958.0123",
  "c_hash": "ABCDe-csTpNdUa0Eri5wFw",
  "email": "user@privaterelay.appleid.com",
  "email_verified": "true",
  "is_private_email": "true",
  "auth_time": 1574131340
}

问题

当我使用Firebase 身份验证 REST API尝试将自定义令牌交换为 ID 和刷新令牌时,我收到以下消息(是的,我已确保令牌在使用时没有过期):

{
  "error": {
    "code": 400,
    "message": "INVALID_CUSTOM_TOKEN",
    "errors": [
      {
        "message": "INVALID_CUSTOM_TOKEN",
        "domain": "global",
        "reason": "invalid"
      }
    ]
  }
}

我希望 Firebase 身份验证中的新“Apple”登录方法能够解决这个问题,一旦配置好,我就可以从 Apple 传递 JWT 令牌。我错过了一步吗?

谢谢 !

4

1 回答 1

1

好的,我想我在发布后不久就找到了自己问题的答案(当然......)。

我使用了错误的 API 端点。相反,我需要使用带有 OAuth 凭据的登录端点:

https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp?key={{apiKey}}

to get back : 

{
  "federatedId": "apple.com/ABCDEF.ABCDEF261958.1234",
  "providerId": "apple.com",
  "email": "user@privaterelay.appleid.com",
  "emailVerified": true,
  "localId": "123456786RbgQgxhzfSpyIJGLPIw1",
  "idToken": "eyJABCDEFG.ABCDEFG.ABCDEFGiFQ",
  "refreshToken": "AEu4IL1CY_PGF...6pN0DuQ",
  "expiresIn": "3600",
  "oauthIdToken": "eyJraWQiO...CJHHrxeg",
  "rawUserInfo": "[JWT token info]",
  "isNewUser": true,
  "kind": "identitytoolkit#VerifyAssertionResponse",
  "pendingToken": "AMzJoSn...HkvLeaOmFjNlcw"
}

提供的 POST 正文应类似于:

{
    "postBody": "id_token=eyJraWQiOiJBSURPUABCDEFGHIJKLMNOP.eyABCDEFGHIJKLMNOP2.KW0JABCDEFGHIJKLMNOP&providerId=apple.com",
    "requestUri": "https://gpsstreaming.firebaseapp.com/__/auth/handler",
    "returnIdpCredential": true,
    "returnSecureToken": true
}

请注意,id_token 是 Apple 的 Sign In With Apple ASAuthorizationAppleIDCredential提供的 3 点符号令牌(JWT 令牌)——出于显而易见的原因,此处对数据进行了混淆。例如,如果您使用 SwiftUI,您可以从 SignInWithAppleButton 的completionBlock中获得。

于 2019-11-19T21:47:41.113 回答