我有来自我的身份提供者的公钥
-----BEGIN PUBLIC KEY-----
THIS
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)
以及来自我客户的 JWT 令牌。
如何根据密钥检查令牌?我遇到了困难,jwt-go因为 Parse 函数需要令牌字符串和一个getKey函数。
不确定如何进行
如何验证和获取从 Amazon Cognito 收到的 JWT 的信息?
我在 Cognito 中设置了 Google 身份验证,并将重定向 uri 设置为命中 API 网关,然后我收到一个代码,我 POST 到这个端点:
https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html
以 RS256 格式接收 JWT 令牌。我现在正在努力验证和解析 Golang 中的令牌。我尝试使用 jwt-go 解析它,但它似乎默认支持 HMAC,并阅读他们推荐使用前端验证的地方。我尝试了其他一些软件包并遇到了类似的问题。
我在这里遇到了这个答案:Go Language and Verify JWT但假设代码已经过时了,就像刚才说的那样panic: unable to find key。
jwt.io 可以很容易地解码密钥,并且可能也可以验证。我不确定亚马逊生成令牌时公共/秘密密钥在哪里,但据我所知,我也需要使用 JWK URL 进行验证?我找到了一些 AWS 特定的解决方案,但它们似乎都有数百行长。在 Golang 中肯定没有那么复杂吧?
我使用 dgrijalva/jwt-go 和 lestrrat-go/jwx。我试图实现的是使用 jwks 验证 wso2 jwt。
令牌(过期令牌):
const tokenStr = `eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImI2TnozUDJwMHg1QWpfWENsUmhrVDFzNlNIQSJ9.eyJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9hcHBsaWNhdGlvbnRpZXIiOiJVbmxpbWl0ZWQiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9rZXl0eXBlIjoiUFJPRFVDVElPTiIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3ZlcnNpb24iOiIxLjAiLCJpc3MiOiJ3c28yLm9yZ1wvcHJvZHVjdHNcL2FtIiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvYXBwbGljYXRpb25uYW1lIjoiVGFseW9uIiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvZW5kdXNlciI6IkZEQkBjYXJib24uc3VwZXIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC9lbmR1c2VyVGVuYW50SWQiOiItMTIzNCIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL3N1YnNjcmliZXIiOiJGREIiLCJodHRwOlwvXC93c28yLm9yZ1wvY2xhaW1zXC90aWVyIjoiR29sZCIsImh0dHA6XC9cL3dzbzIub3JnXC9jbGFpbXNcL2FwcGxpY2F0aW9uaWQiOiIxNDU2IiwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvdXNlcnR5cGUiOiJBUFBMSUNBVElPTiIsImV4cCI6MTU4OTQ2NjI0MSwiaHR0cDpcL1wvd3NvMi5vcmdcL2NsYWltc1wvYXBpY29udGV4dCI6IlwvY3VycmVudC1hY2NvdW50XC9jaGVxdWVzXC9hdXRvbWF0aWMtZGVwb3NpdHNcL2F0bVwvMS4wIn0=.K1iPtdXiuicuDPaLC6Exw/7UpJVW6Uy1tPpJlfZ29Vqs9M1zR00JpKxvymQMAzbD0GHlXPPsZmhDxOn0WMAPfr1Xi8tiruTLXNbwUPJ/SOovt+zK4JGtrydhc4iv2EROhMUk2uwJUb4DFjqKZRhBvtCW7fRtdtI9yJL4W4OK8Ld90yOb97usPjEPz8S4E4uNrb5lE2rLzIp+EaPwA232lDkhS8gGPIKdlLG1IdEfQ4cFU1VIplvWoHzprF9mGR0ahT2QGgmGE3AcBfkURk8VzIKDG/UcBA9eHu3XGg28j3OvIXWwJhd7Hi+jTqvggi0hplao8ElvjNBw/wNy2UO9WA==`
Run Code Online (Sandbox Code Playgroud)
jwks:
{"keys":[{"kty":"RSA","e":"AQAB","use":"sig","kid":"MjhhMDk2N2M2NGEwMzgzYjk2OTI3YzdmMGVhOGYxNjI2OTc5Y2Y2MQ","alg":"RS256","n":"zZU9xSgK77PbtkjJgD2Vmmv6_QNe8B54eyOV0k5K2UwuSnhv9RyRA3aL7gDN-qkANemHw3H_4Tc5SKIMltVIYdWlOMW_2m3gDBOODjc1bE-WXEWX6nQkLAOkoFrGW3bgW8TFxfuwgZVTlb6cYkSyiwc5ueFV2xNqo96Qf7nm5E7KZ2QDTkSlNMdW-jIVHMKjuEsy_gtYMaEYrwk5N7VoiYwePaF3I0_g4G2tIrKTLb8DvHApsN1h-s7jMCQFBrY4vCf3RBlYULr4Nz7u8G2NL_L9vURSCU2V2A8rYRkoZoZwk3a3AyJiqeC4T_1rmb8XdrgeFHB5bzXZ7EI0TObhlw"}]}
Run Code Online (Sandbox Code Playgroud)
那里看到的大多数示例都使用“kid”并且不相关,因为我的令牌标头没有它,它有“x5t”字段。
我还必须注意一件事,我的签名似乎是 base64 编码的,而不是 base64 url 编码的(它几乎扰乱了 Parse 方法的使用)。我尝试过使用 jwt.Parse() 我尝试过手动加密标头和有效负载 sha256 以及 RS256 和 base64 但没有显示成功。
我尝试过的事情:
const tokenString = `..`
func main() {
t, err := jwt.Parse(tokenStr, func(t *jwt.Token) (interface{}, error) {
return []byte("b6Nz3P2p0x5Aj_XClRhkT1s6SHA"), nil
})
}
Run Code Online (Sandbox Code Playgroud) 我有一个/token正在使用password授权的端点。因为它对JWT令牌进行编码,所以它具有大约 1 秒的高延迟。有没有办法让 JWT 签名更快?
我正在使用 Go 与github.com/dgrijalva/jwt-go图书馆。
package main
import (
"crypto/rsa"
"git.snappfood.ir/golang/framework/assert"
"io/ioutil"
"time"
"github.com/dgrijalva/jwt-go"
"github.com/sirupsen/logrus"
)
var (
private *rsa.PrivateKey
public *rsa.PublicKey
)
func main() {
var err error
var priv, pub []byte
pub, err = ioutil.ReadFile("public.pem")
if err!=nil{
panic(err)
}
priv, err = ioutil.ReadFile("private.pem")
if err!=nil{
panic(err)
}
public, err = jwt.ParseRSAPublicKeyFromPEM(pub)
if err!=nil{
panic(err)
}
private, err = jwt.ParseRSAPrivateKeyFromPEM(priv)
if err!=nil{
panic(err)
}
data := map[string]interface{}{
"jti": …Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码创建令牌
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.StandardClaims{
Subject: string(user.Id),
})
tokenString, err := token.SignedString([]byte("secret"))
Run Code Online (Sandbox Code Playgroud)
并尝试使用以下代码解析它们
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, UnauthorizedError
}
return []byte("secret"), nil
})
if err != nil {
return -1, UnauthorizedError
}
if !token.Valid {
return -1, UnauthorizedError
}
claims, ok := token.Claims.(jwt.MapClaims)
if !ok {
return -1, UnauthorizedError
}
logrus.Info(claims)
Run Code Online (Sandbox Code Playgroud)
为什么我不能将我的声明转换为 StandardClaims 并访问 claim.Subject?
我想exp从 JSON 网络令牌 (JWT)解析到期日期 ( ),而无需对其进行验证。我尝试了以下脚本(试图遵循How to parse unix timestamp to time.Time):
package main
import (
"fmt"
"log"
"strconv"
"time"
jwt "github.com/dgrijalva/jwt-go"
)
func main() {
tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
token, _, err := new(jwt.Parser).ParseUnverified(tokenString, jwt.MapClaims{})
if err != nil {
log.Fatal(err)
}
if claims, ok := token.Claims.(jwt.MapClaims); ok {
fmt.Println(claims["exp"])
i, err := strconv.ParseInt(claims["exp"].(string), 10, 64)
if err != nil {
log.Fatal(err)
}
tm := time.Unix(i, 0)
fmt.Println(tm)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
> go run main.go
<nil> …Run Code Online (Sandbox Code Playgroud) 我想检查 JWT 是否是从我们的服务器生成的?
我使用 JWT 进行身份验证并使用 RS256 作为 JWT 的算法
现在,我想在 Golang 中编写一个函数来验证 JWT 令牌是否是我们的。下面是我已经实现的代码:
publicKey = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAxxxxxxf2iF+20xHTZ4jTUBzYmikBuUsm0839T5SDmwEquTB\nfQIDAQAB\n-----END PUBLIC KEY-----\n"
// sample token string taken from the New example
tokenString := this.JWT[0]
claims := jwt.MapClaims{}
token, err := jwt.ParseWithClaims(tokenString, &claims, func(token *jwt.Token) (interface{}, error) {
return []byte(publicKey), nil
})
// ... error handling
if err != nil {
fmt.Println(err)
}
fmt.Println("TOKEN is:", token.Valid)
// do something with decoded claims
for key, val := range claims {
fmt.Printf("Key: %v, …Run Code Online (Sandbox Code Playgroud) 最近,应用商店服务器 API 中添加了一种新的 API查找订单 ID 。以及由 App Store 签名的此 API 响应的JWSTransaction ,采用 JSON Web 签名格式。我们想用 go 来验证一下。
我们尝试过什么
type JWSTransaction struct {
BundleID string `json:"bundleId"`
InAppOwnershipType string `json:"inAppOwnershipType"`
TransactionID string `json:"transactionId"`
ProductID string `json:"productId"`
PurchaseDate int64 `json:"purchaseDate"`
Type string `json:"type"`
OriginalPurchaseDate int64 `json:"originalPurchaseDate"`
}
func (ac *JWSTransaction) Valid() error {
return nil
}
func (a *AppStore) readPrivateKeyFromFile(keyFile string) (*ecdsa.PrivateKey, error) {
bytes, err := ioutil.ReadFile(keyFile)
if err …Run Code Online (Sandbox Code Playgroud) 我需要从 Go 中的 JWT 检索子声明的值。
我有(旧的)JWT,我需要在 go 中解析,其中包含一个自定义声明“数据”,其中包含一个由一些字段(用户 ID、用户名)组成的 Json 对象,所以
{ [...standard claims]..., "data":{"id":"123", "name":"JohnDoe"} }
Run Code Online (Sandbox Code Playgroud)
通过 using github.com/dgrijalva/jwt-go,我可以解析令牌并通过以下方式访问声明:
{ [...standard claims]..., "data":{"id":"123", "name":"JohnDoe"} }
Run Code Online (Sandbox Code Playgroud)
这对于标准声明来说效果很好,而且我还从“数据”声明中的 Json-Sub-Object 获取字段名称,但不是字段值(所有空字符串)。我还尝试设置与声明层次结构匹配的结构(外部和内部结构),但没有成功。
访问子声明值的方法是什么?
我正在尝试生成代码中提到的令牌,但尽管我正在使用,但它在这一行给了我错误
tokenString, err := token.SignedString(mySigningKey)因为密钥的类型无效
有什么建议来解决这个问题吗?
谢谢
package main
import (
"fmt"
"github.com/dgrijalva/jwt-go"
"time"
)
var (
mySigningKey = []byte("secret")
)
func GenerateJWT() (string, error) {
token := jwt.New(jwt.SigningMethodES256)
claims := token.Claims.(jwt.MapClaims)
claims["authorized"] = true
claims["user"] = "ravi"
claims["exp"] = time.Now().Add(time.Minute + 30).Unix()
tokenString, err := token.SignedString(mySigningKey)
if err != nil {
fmt.Println(err)
fmt.Errorf("Something went wrong : %s", err.Error())
return "", err
}
return tokenString, nil
}
func main() {
tokenString, err := GenerateJWT()
if err != nil …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个 API,经过一段时间后,我现在了解如何在 Go 中使用 JWT 来获取令牌。使用此令牌,我可以保持用户连接,但是如何从客户端应用程序注销?
这是我的token.go代码:
package main
import (
"github.com/dgrijalva/jwt-go"
"time"
)
const (
tokenEncodeString = "something"
)
func createToken(user User) (string, error) {
// create the token
token := jwt.New(jwt.SigningMethodHS256)
// set some claims
token.Claims["username"] = user.Username;
token.Claims["password"] = user.Password;
token.Claims["exp"] = time.Now().Add(time.Hour * 72).Unix()
//Sign and get the complete encoded token as string
return (token.SignedString([]byte(tokenEncodeString)))
}
func parseToken(unparsedToken string) (bool, string) {
token, err := jwt.Parse(unparsedToken, func(token *jwt.Token) (interface{}, error) {
return []byte(tokenEncodeString), nil …Run Code Online (Sandbox Code Playgroud) 我正在使用 jwt-go 库创建 jwt 令牌。后来写了一个脚本来加载测试。我注意到当我发送许多并发请求时获得相同的令牌。为了检查更多信息,我在 for 循环中创建了令牌,结果是相同的。
我使用的库是https://github.com/dgrijalva/jwt-go,go 版本是 1.12.9。
expirationTime := time.Now().Add(time.Duration(60) * time.Minute)
for i := 1; i < 5; i++ {
claims := &jwt.StandardClaims{
ExpiresAt: expirationTime.Unix(),
Issuer:"telescope",
}
_token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
var jwtKey = []byte("secret_key")
auth_token, _ := _token.SignedString(jwtKey)
fmt.Println(auth_token)
}
Run Code Online (Sandbox Code Playgroud) 我需要解码我的 JWT 令牌并检查范围是否是“医生”。
我对 GO 知之甚少,但我只需要在我的应用程序中编写一个小片段来扩展现有应用程序,因此它需要用 GO 编写。
这是我尝试解码令牌并检查“Doctor”是否在解码的令牌中,因为我无法专门访问范围。
for k, v := range props {
token_value := fmt.Sprint(v)
token_key := fmt.Sprint(cfg.AuthKey)
if (k == "custom_token_header") && strings.Contains(token_value, token_key) {
if token, _ := jwt.Parse(token_value, nil); token != nil {
parsed_token := fmt.Sprint(token)
log.Infof("Parsed token: " ,parsed_token)
if strings.Contains(parsed_token, "Doctor") {
log.Infof("user is a Doctor, perform checks...")
loc, _ := time.LoadLocation("GMT")
now := time.Now().In(loc)
hr, _, _ := now.Clock()
if hr >= 9 && hr < 5 {
log.Infof("success, inside …Run Code Online (Sandbox Code Playgroud)