Google app engine 如何验证JWT签名?

Google app engine 如何验证JWT签名?,google-app-engine,go,jwt,google-oauth,google-api-go-client,Google App Engine,Go,Jwt,Google Oauth,Google Api Go Client,我想用Go AppEngine后端验证Android用户 我可以通过以下方式在Android中轻松获得ID令牌 ID令牌有效负载可以通过库的oauth2/v2包进行验证 在AppEngine中使用它需要一些安装调整,我在 根据文件:“验证签名 事实证明,这是使用谷歌公钥/私钥对签名的,谷歌在www.googleapis.com/oauth2/v1/certs上发布了公钥(我们会定期更改);请继续查看 您必须验证ID令牌(实际上是一个JSON Web令牌)是否使用其中一个证书进行了签名。幸运的是,

我想用Go AppEngine后端验证Android用户

我可以通过以下方式在Android中轻松获得ID令牌

ID令牌有效负载可以通过库的oauth2/v2包进行验证

在AppEngine中使用它需要一些安装调整,我在

根据文件:“验证签名 事实证明,这是使用谷歌公钥/私钥对签名的,谷歌在www.googleapis.com/oauth2/v1/certs上发布了公钥(我们会定期更改);请继续查看

您必须验证ID令牌(实际上是一个JSON Web令牌)是否使用其中一个证书进行了签名。幸运的是,有一些不错的库可以做到这一点;在本文中,我将给出Java、Ruby和PHP的指针

这些库可以缓存谷歌证书,并且只在需要时刷新它们,因此验证(几乎总是)是一个快速的静态调用。”


如何在Go中验证令牌是否由Google签名?

这就是我最终要做的(使用):


您可能想看看appengine签名扩展,它位于

为什么对索赔[“azp”]进行重复测试并发布给?
package XXX

import (
    "errors"
    oauth2 "code.google.com/p/google-api-go-client/oauth2/v2"
    "jwt"
    "appengine"
    "appengine/urlfetch"
)

func getTokeninfo(c appengine.Context, token string) (*oauth2.Tokeninfo, error) {
    client := urlfetch.Client(c)

    oauth2Svc, err := oauth2.New(client) 

    if err != nil {
        return nil, err
    }

    return oauth2Svc.Tokeninfo().Id_token(token).Do()
}

func verifyToken(c appengine.Context, token string) (string, error) {
    parsedToken, err := jwt.Parse(token)

    if err != nil {
        c.Debugf(err.Error())
        return "", err
    }

    if parsedToken.Claims["aud"] != "XXX.apps.googleusercontent.com" {
        c.Debugf("aud mismatch")
        return "", errors.New("Aud mismatch")
    }

    if (parsedToken.Claims["azp"] != "XXX.apps.googleusercontent.com") && 
        (parsedToken.Claims["azp"] != "XXX.apps.googleusercontent.com") {

        c.Debugf("azp mismatch")
        return "", errors.New("Azp mismatch")
    }

    ti, err := getTokeninfo(c, token)

    if err != nil {
        c.Debugf(err.Error())
        return "", err
    }

    if (ti.Issued_to != "XXX.apps.googleusercontent.com") &&
        (ti.Issued_to != "XXX.apps.googleusercontent.com") {

        c.Debugf("cid mismatch")
        return "", errors.New("Client ID mismatch")
    }

    return ti.User_id, nil
}