go + jwt + 權限認證

 

1.生成的token長度和jwtCustomClaims(playload)大小相關

2.支持jwt.SigningMethodHS256和jwt.SigningMethodES256,jwt.SigningMethodRS256等加密方法

package main
import(
	"github.com/dgrijalva/jwt-go"
	//"time"
	"reflect"
	"fmt"	
	log "github.com/thinkboy/log4go"
)

type TokenPlayload struct{
	AccountId  string `json:"account_id"` //結構體成員首字母儘量大寫,否則在其他包中就無法引用
	Terminal   string `json:"terminal"`
	GroupId    int64  `json:"group"`
}

type jwtCustomClaims struct {
	jwt.StandardClaims
	TokenPlayload	
}

func CreateToken(SecretKey []byte, issuer string, tokenPlayload *TokenPlayload) (tokenString string, err error) {	
	claims := &jwtCustomClaims{
		jwt.StandardClaims{
			//ExpiresAt: int64(time.Now().Add(time.Hour * 72).Unix()),			
			// Issuer:    issuer,
		},
		*tokenPlayload,		
	}	
	log.Info(claims)	
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenString, err = token.SignedString(SecretKey)
	return
}

func ParseToken(tokenSrt string, SecretKey []byte) (claims jwt.Claims, err error) {
	var token *jwt.Token
	token, err = jwt.Parse(tokenSrt, func(*jwt.Token) (interface{}, error) {
		return SecretKey, nil
	})
	claims = token.Claims
	return
}

func main(){
	log.Info("test begin")
	SecretKey := "123"
	tokenPlayload := TokenPlayload{	
		"5d5a92150d60a5726471cd3a",	
		"mobile",
		5,
	}
	tokenPlayload.AccountId = "123"
	token, _ := CreateToken([]byte(SecretKey), "YDQ", &tokenPlayload)  
	log.Info(token)
	claims, _ := ParseToken(token, []byte(SecretKey))
	v := reflect.ValueOf(claims)
    if v.Kind() == reflect.Map {
        for _, k := range v.MapKeys() {
			value := v.MapIndex(k)
			key := fmt.Sprintf("%s", k.Interface())				
			strValue := fmt.Sprintf("%v", value.Interface())  //使用%v 兼容value是所有類型,不僅僅是字符串
			log.Info("%s : %s", key, strValue)
        }
    }
	log.Info(claims)
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章