golang中jwt使用

golang 中jwt使用方式总结。

1. golang示例代码

import (
	"fmt"

	"time"

	"github.com/dgrijalva/jwt-go"
)

var (
	SIGN_NAME_SCERET = "aweQurt178BNI"
)

func main() {
	fmt.Println("Hello World!")

	tokenString, err := createJwt()
	if err != nil {
		fmt.Println(err.Error())
		return
	}

	fmt.Println(tokenString)

	claims := parseJwt(tokenString)
	fmt.Println(claims)

}

//验证
//在调用Parse时,会进行加密验证,同时如果提供了exp,会进行过期验证;
//如果提供了iat,会进行发行时间验证;如果提供了nbf,会进行发行时间验证.


//创建 tokenString
func createJwt() (string, error) {
	//	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
	//		"foo": "bar",
	//		"nbf": time.Date(2015, 10, 10, 12, 0, 0, 0, time.UTC).Unix(),

	//	})

	token := jwt.New(jwt.SigningMethodHS256)
	claims := make(jwt.MapClaims)
	claims["foo"] = "bar"
	claims["exp"] = time.Now().Add(time.Hour * time.Duration(1)).Unix()
	claims["iat"] = time.Now().Unix()
	token.Claims = claims

	// Sign and get the complete encoded token as a string using the secret
	tokenString, err := token.SignedString([]byte(SIGN_NAME_SCERET))
	return tokenString, err
}


//解析tokenString
func parseJwt(tokenString string) jwt.MapClaims {
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// Don't forget to validate the alg is what you expect:
		if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
			return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
		}

		// hmacSampleSecret is a []byte containing your secret, e.g. []byte("my_secret_key")
		return []byte(SIGN_NAME_SCERET), nil
	})

	var claims jwt.MapClaims
	var ok bool

	if claims, ok = token.Claims.(jwt.MapClaims); ok && token.Valid {
		fmt.Println(claims["foo"], claims["nbf"])
	} else {
		fmt.Println(err)
	}

	return claims
}

说明:dgrijalva/jwt-go 包中提供了简单的方法去签发和验证token。在进行过期时间检查时,使用的是iat 和exp 两个key进行,并未提供专门的设置过期时间的方法。

2. golang中解析java创建的token字符串

在golang中解析java创建的token,需要注意token的签名加密字符串。在java中,使用了方法TextCodec.BASE64.decode(base64EncodedSecretKey)。所以在token中,也要进行相应的转换,将key的转化格式改成mySignKeyBytes, err := base64.URLEncoding.DecodeString(“abcdksdjkf123”)。

示例代码

a. java创建token代码

public static void main(String[] args) {
    String tokenSecretKey="abcdksdjkf123";   //密钥
    Map<String, Object> claims = new HashMap<String, Object>();
    claims.put("iss", "doubles"); 

    String token = Jwts.builder()
            .setHeaderParam("typ", "JWT")   //设置头参数
            .setClaims(claims)                    //设置内容对象
            .signWith(SignatureAlgorithm.HS256, tokenSecretKey) //设置加密方式和传入密钥
            .compact();                           //生成token
    System.out.println(token);  
}

b. golang解析java token代码

func ParseAuthToken()  {
    mySignKey := "abcdksdjkf123"     //密钥,同java代码
    mySignKeyBytes, err := base64.URLEncoding.DecodeString(mySignKey)   //需要用和加密时同样的方式转化成对应的字节数组
    if err != nil {
        fmt.Println("base64 decodeString failed.", err)
        return
    }
    token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDQ3NDk0NDIsImZvbyI6ImJhciIsImlhdCI6MTU0NDc1MzA0Mn0.t1NwZOUJP4Vj3L4YAiHletRNlc8vEtOMrjRAiyKl8aA"
    parseAuth, err := jwt.Parse(token, func(*jwt.Token) (interface{}, error) {
        return mySignKeyBytes, nil
    })
    if err != nil {
        fmt.Println("parase with claims failed.", err)
        return
    }
    fmt.Println( parseAuth.Claims)
}

posted on 2018-12-14 10:07  天文学  阅读(736)  评论(0编辑  收藏  举报

导航