假如sso单点登录平台是java写的,我的engineercms是golang写的,单点登录sso平台后返回java生成的token,我的ecms来解析这个token。一直出错,总结和解决如下:
坑1:secret长度和 要求,随便写一个不行,比如“hello”这样不行,短了不行,比如“abcdefghijklmnopqrstuvwxyz”这个不行。这个是可行的:“whatthefuck123weishenmebuneng123”
坑2:java生成的token,在golang上解析需要encode……如下,直接用byte(secret)不行。
坑3:用URLENcoding不行,要用RawStdEncoding。
// 校验token是否有效 返回参数
func LubanCheckToken(tokenString string) (userId, userName string, err error) {
//坑1:密钥必须要长,要达到这个位数,26个英文字母是不行的。!!!!
mySignKey := "whatthefuck123weishenmebuneng123" //密钥,同java代码,
// mySignKeyBytes, err := base64.URLEncoding.DecodeString(mySignKey) //需要用和加密时同样的方式转化成对应的字节数组
mySignKeyBytes, err := base64.RawStdEncoding.DecodeString(mySignKey) //要用Raw这个
if err != nil {
fmt.Println("base64 decodeString failed.", err)
return "", "", err
}
// 原文链接:https://blog.csdn.net/qiang527052/article/details/80748700
tokenString = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4OCIsInN1YiI6IuWwj-eZvSIsImlhdCI6MTYzMzAxNjU0OSwiY29tcGFueUlkIjoiOTk5OTk5OSIsImNvbXBhbnlOYW1lIjoi6bKB54-tIn0.W9p52lAzo9EcNSb_Uwf7MK9Lw-vNvG_8HHI-piMkNpY"//测试token
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(mySignKey), nil //坑3 这个不行,要用下面decode后的
return mySignKeyBytes, nil
})
if err != nil {
beego.Error(err)
return "", "", err
}
// token.Valid里已经包含了过期判断
if token != nil { //&& token.Valid
beego.Info("You look nice today")
claims, _ := token.Claims.(jwt.MapClaims)
// userId = claims["login_user_key"].(string)
// userName = claims["userName"].(string)
userName = claims["companyId"].(string)
}
return userId, userName, err
}
建议:
在jwt.io网站在线检测——总是出现invalid signature问题
将java生成的token拷贝的网站左侧输入框内,右侧下方填写secret和勾选base64 encoded。如下图: