google-app-engine - 如何验证 JWT 签名?

标签 google-app-engine go jwt google-oauth google-api-go-client

我想使用 Go AppEngine 后端对 Android 用户进行身份验证,

我可以通过关注 http://android-developers.blogspot.co.il/2013/01/verifying-back-end-calls-from-android.html 在 Android 中轻松获得 ID token

可以使用 https://code.google.com/p/google-api-go-client/ 的 oauth2/v2 包验证 ID-token 负载图书馆。

一些安装调整对于与 AppEngine 一起使用是必要的,我在 http://golangtutorials.blogspot.co.il/2011/11/using-external-api-in-go-appengine.html 找到了一些指示。

根据文档:“验证签名 事实证明,这是使用 Google 公钥/私钥对签名的,并且 Google 在 www.googleapis.com/oauth2/v1/certs 上发布了公钥(我们会定期更改);去看看吧。

您必须验证 ID token (实际上是 JSON Web token )是否使用其中一个证书进行了签名。幸运的是,周围有不错的图书馆可以做到这一点;在这篇文章中,我将给出 Java、Ruby 和 PHP 的指导。

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

我如何在 Go 中验证 token 是否由 Google 签名?

最佳答案

这就是我最终做的(使用 https://github.com/dgrijalva/jwt-go ):

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
}

关于google-app-engine - 如何验证 JWT 签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16187548/

相关文章:

http - 如何限制用 golang 编写的 Web 服务器允许特定地址而不是模式?

json - 包含接口(interface)列表的结构上的 UnmarshalJSON

go - 将原始 Goreq.body 响应附加到文件

google-app-engine - 将许多 PropertyList 放入 Google App Engine 数据存储区(在 Go 中)并使用 Query.GetAll 再次加载它们

google-app-engine - GAE 产生 "UnknownError: ApplicationError: 7"

asp.net-web-api - 如何验证 GCP Pub/sub 推送订阅 token ?

java - Camel如何将授权 header 添加到休息路线?

oauth - 在微服务之间传递用户身份和授权

python - 使用命令行时出现 App Engine 问题

android - 无法解析 : com. google.firebase :firebase-database:10. 2.0