403 Запрещенная ошибка при отправке push-запроса в APNS с помощью Go. Правильно ли я создаю JWT?

При отправке запроса push-уведомления в APNS возникает следующая ошибка: &{403 Forbidden 403 HTTP/2.0 2 0 map[Apns-Id:[7BF53274-A04B-7C1B-8312-DB01DA48A519]] {0xc0000c88c0} -1 [] false false map[] 0xc000132000 0xc0000ba370}

Я подозреваю, что мой код для создания заголовка аутентификации неверен

Вот соответствующий код:

func generateAuthenticationHeader() string {
    b, _ := json.Marshal(Header{ ALG: "ES256", KID: authKeyId })
    header := b64.StdEncoding.EncodeToString(b)

    b, _ = json.Marshal(Claims{ ISS: teamId, IAT: time.Now().String() })
    claims := b64.StdEncoding.EncodeToString(b)

    pkey := getPrivateKey()

    indata := fmt.Sprintf("%s.%s", header, claims)
    h := sha256.New()
    h.Write([]byte(indata))
    digest := h.Sum(nil)

    r, s, err := ecdsa.Sign(rand.Reader, pkey, digest)
    if err != nil {
        log.Fatal(err)
    }

    signature := r.Bytes()
    signature = append(signature, s.Bytes()...)

    signed := b64.StdEncoding.EncodeToString(signature)

    return fmt.Sprintf("%s.%s.%s", header, claims, signed)
}

func getPrivateKey() *ecdsa.PrivateKey {
    r, _ := ioutil.ReadFile(authKeyPath)
    block, _ := pem.Decode(r)

    key, err := x509.ParsePKCS8PrivateKey(block.Bytes)
    if err != nil {
        log.Fatal(err)
    }
    pkey := key.(*ecdsa.PrivateKey)

    return pkey
}

1 ответ

Решение

Проблема заключалась в неправильном типе заявки IAT. Вместо строки это должно быть int64, а время должно быть в секундах. Вызов String() вовремя.Now() возвращает формат, отличный от того, который Apple ожидает от IAT, согласно их документации: https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns.

Другие вопросы по тегам