使用 Go 向 APNS 发出推送请求时出现 403 禁止错误。我是不是正确创建了 JWT?

Posted

技术标签:

【中文标题】使用 Go 向 APNS 发出推送请求时出现 403 禁止错误。我是不是正确创建了 JWT?【英文标题】:403 Forbidden error when making a push request to APNS with Go. Am I creating the JWT correctly?使用 Go 向 APNS 发出推送请求时出现 403 禁止错误。我是否正确创建了 JWT? 【发布时间】:2019-10-09 16:26:22 【问题描述】:

向 APNS 发出推送通知请求时出现以下错误:&403 Forbidden 403 HTTP/2.0 2 0 map[Apns-Id:[7BF53274-A04B-7C1B-8312-DB01DA48A519]] 0xc0000c88c0 -1 []假假地图[] 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) 您是否尝试过使用其中一个可用的 jwt 包? 2) 你确定你有所有需要的声明吗? @bserdar 我没有尝试过任何 JWT 包,是的,声明都在那里。 查看 jwt 是否损坏的一种方法是在 jwt.io 上尝试一下,看看它是否可以解码。你是如何发送jwt的?是承载认证吗? @bserdar 我已经修好了;我不得不将 IAT 声明类型从 string 更改为 int64,并使用 time.Now().Unix() 而不是 String()。我刚刚阅读了 Apple 的文档,可能以前应该这样做过。无论如何谢谢:) 【参考方案1】:

问题在于 IAT 声明类型不正确。它应该是 int64 而不是字符串,时间应该以秒为单位。根据他们的文档:https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns,在 time.Now() 上调用 String() 返回的格式与 Apple 期望的 IAT 声明的格式不同。

【讨论】:

以上是关于使用 Go 向 APNS 发出推送请求时出现 403 禁止错误。我是不是正确创建了 JWT?的主要内容,如果未能解决你的问题,请参考以下文章

发出 POST 请求时出现推送错误的 Laravel WebSocket

在 Express.js 上使用 Axios 向 Spotify API 发出 POST 请求时出现错误 400

向 SWR 发出请求时出现打字稿问题

Flutter Web,向具有自签名证书的服务器发出请求时出现问题

向公共 API 发出请求时出现“无 'Access-Control-Allow-Origin' 标头”错误

向 Spotify API 发出 PUT 请求时出现 401 错误