[英]how to verify JWT signature?
我想使用 Go AppEngine 后端对 Android 用户进行身份验证,
我可以通过以下http://android-developers.blogspot.co.il/2013/01/verifying-back-end-calls-from-android.html在 Android 中轻松获取 ID 令牌
可以使用https://code.google.com/p/google-api-go-client/库的 oauth2/v2 包验证 ID 令牌负载。
将它与 AppEngine 一起使用需要一些安装调整,我在http://golangtutorials.blogspot.co.il/2011/11/using-external-api-in-go-appengine.html找到了一些指示
根据文档:“验证签名事实证明这是使用 Google 公钥/私钥对进行签名的,并且 Google 在 www.googleapis.com/oauth2/v1/certs 上发布了公钥(我们会定期更改);去向前看。
您必须验证 ID 令牌(实际上是 JSON Web 令牌)是否使用这些证书之一进行了签名。 幸运的是,周围有一些不错的库可以做到这一点; 在这篇文章中,我将给出 Java、Ruby 和 PHP 的指导。
这些库可以缓存 Google 证书,并且仅在需要时才刷新它们,因此验证(几乎总是)是一个快速的静态调用。”
如何在 Go 中验证令牌是否由 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
}
您可能想在https://github.com/someone1/gcp-jwt-go查看 appengine 签名扩展
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.