Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
403使用Go向APN发出推送请求时出现禁止的错误。我是否正确创建了JWT?_Go_Apple Push Notifications_Pem_P8 - Fatal编程技术网

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

403使用Go向APN发出推送请求时出现禁止的错误。我是否正确创建了JWT?,go,apple-push-notifications,pem,p8,Go,Apple Push Notifications,Pem,P8,向APNS发出推送通知请求时,我遇到以下错误:&{403禁止403 HTTP/2.0 2 0映射[APNS Id:[7BF53274-A04B-7C1B-8312-DB01DA48A519]{0xc0000c88c0}-1[]假映射[]0xc000132000 0xc0000ba370} 我怀疑生成身份验证标头的代码不正确 以下是相关代码: func generateAuthenticationHeader() string { b, _ := json.Marshal(Header{

向APNS发出推送通知请求时,我遇到以下错误:&{403禁止403 HTTP/2.0 2 0映射[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
}

问题在于IAT索赔类型不正确。它应该是int64而不是string,时间应该是秒。在time.Now()上调用String()返回的格式与苹果公司预期的IAT声明不同,根据他们的文档:

1)您是否在可用的jwt软件包中试用过此功能?2) 你确定你有所有需要的声明吗?@bserdar我没有尝试过任何JWT包,是的,声明都在那里。你可以看到你的JWT是否损坏的一种方法是在JWT.io上尝试,看看它是否可以解码。你是如何发送jwt的?它是持证人身份证吗?@bserdar我已经修好了;我必须将IAT声明类型从string更改为int64,并使用time.Now().Unix()代替string()。我刚刚阅读了苹果的文档,可能以前就应该这样做。无论如何,谢谢你:)