Как проверить identityToken из входа в систему с помощью Apple?

Я пытаюсь проверить идентификационный токен, полученный от службы «Войти через Apple».

В документе говорится, что идентификационный токен является веб-токеном JSON (JWT), но я получил токен удостоверения в следующем формате:

identityToken = ZXlKcmFXUWlPaUpCU1VSUFVFc3hJaXdpWVd4bklqb2lVbE15TlRZaWZRLmV5SnBjM01pT2lKb2RIUndjem92TDJGd2NHeGxhV1F1WVhCd2JHVXVZMjl0SWl3aVlYVmtJam9pWTI5dExteHZiMjVuTG5Oa2F5NTBaWE4wTG05MlpYSnpaV0VpTENKbGVIQWlPakUxTnpBNE5qSTJPVElzSW1saGRDSTZNVFUzTURnMk1qQTVNaXdpYzNWaUlqb2lNREF4TURNNUxqSXpNemxrWXpReU9XWXhPVFExWW1NNVpqQXpZekU1T1RVeU1HUXlZMlUwTGpBek1EWWlMQ0pqWDJoaGMyZ2lPaUpoWkhZMFEyVnZSMjF5VDNWbVZrbG9SRzl4TFhobklpd2lZWFYwYUY5MGFXMWxJam94TlRjd09EWXlNRGt5ZlEuT19nTm1hTDdtd1hXcUpKX1ZIaElzT25IYWF4cnM0a1VWMVJzWjZwWEdHT1JFcnAxeXU0TzRzcWwtbnJrRl9xR2pRN2syLWxoQ25BWnRYOC13ektRNUM3M0NZZTFJRW1VTUFSS2ItYk1fdGx2YlVscmhXRGhkSjZSWVdpaTEwVklyN0oway1pZlEyb3lXUmRUTnNDTmpBaHM4SVMzYWxfQ0RqajhyY2hQa1djRHBKMGdqSm9Bamhua2hFRlllVWMxMWxaazFHVmRITXVoN3hqNUotVW1HNFNlczJ0OXBvcjZaTjZhc0lucENnM3lKaU5YREtMRDg2enRtc1NEem1rTGhFX2JLLWhaZlRRakNTSWx4TDJobm82NlVPbVJfMTNibDdsRmo0cTF3RVVQeFRCMDZGcTBBNkRXQ1lVa1ZaN0dScVhCWURDNUNqX2hhd2ZHUTIwandR

Этот токен не является форматом JWT. Как мне обращаться с токеном идентификации, чтобы получить формат JWT?


person Iafeavvef    schedule 14.10.2019    source источник


Ответы (4)


Я почти уверен, что вы снова кодируете строку base64. Просто сделай из этого веревку, и все будет в порядке

String(data: appleIdCredential.identityToken!, encoding: .utf8)
person Michael Knoch    schedule 22.03.2020

Возможно, что-то не так с вашим «Войти через Apple». Это должно вернуть такой ответ:

{
  "authorizationCode": ...,
  "identityToken": ...,
  "realUserStatus": ...,
  "user": ...
}

Где "identityToken" - это то, что вы ищете, токен JWT со следующей информацией:

{
  "iss": "https://appleid.apple.com",
  "aud": ...,
  "exp": 1575106544,
  "iat": 1575105944,
  "sub": ...,
  "c_hash": ...,
  "email": ...,
  "email_verified": "true",
  "is_private_email": "true",
  "auth_time": 1575105944
}

Вот документ: https://developer.apple.com/documentation/signinwithapple.com/documentation/signinwithapple.com/documentation/signinwithapple.com/documentation/signinwithapple а>

person François de Bellescize    schedule 30.11.2019

Идентификационный токен будет в кодировке base64. Вы можете распечатать его в отладчике, например

po String(data: appleIdCredential.identityToken!, encoding: .utf8)!

А затем вы можете скопировать вывод этого в jwt.io, чтобы проверить его содержимое.

(Значение вашего примера не является допустимым значением jwt, поэтому я не уверен, откуда вы его взяли.)

person B Roy Dawson    schedule 08.01.2020

просто передайте токен идентификатора для функции декодирования

func decode(jwtToken jwt: String) -> [String: Any] {
  let segments = jwt.components(separatedBy: ".")
  return decodeJWTPart(segments[1]) ?? [:]
}

func base64UrlDecode(_ value: String) -> Data? {
  var base64 = value
    .replacingOccurrences(of: "-", with: "+")
    .replacingOccurrences(of: "_", with: "/")

  let length = Double(base64.lengthOfBytes(using: String.Encoding.utf8))
  let requiredLength = 4 * ceil(length / 4.0)
  let paddingLength = requiredLength - length
  if paddingLength > 0 {
    let padding = "".padding(toLength: Int(paddingLength), withPad: "=", startingAt: 0)
    base64 = base64 + padding
  }
  return Data(base64Encoded: base64, options: .ignoreUnknownCharacters)
}

func decodeJWTPart(_ value: String) -> [String: Any]? {
  guard let bodyData = base64UrlDecode(value),
    let json = try? JSONSerialization.jsonObject(with: bodyData, options: []), let payload = json as? [String: Any] else {
      return nil
  }

  return payload
}

нравиться:

let jwt = попробуйте декодировать (jwtToken: stringToken)

а затем вы можете получить необходимые данные, например:

пусть _ = jwt [] как? Нить

person stm apps    schedule 31.03.2021