前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang和java之间jwt token解析遇到的坑

golang和java之间jwt token解析遇到的坑

作者头像
hotqin888
发布2021-12-07 13:12:42
1.7K0
发布2021-12-07 13:12:42
举报
文章被收录于专栏:hotqin888的专栏

假如sso单点登录平台是java写的,我的engineercms是golang写的,单点登录sso平台后返回java生成的token,我的ecms来解析这个token。一直出错,总结和解决如下:

坑1:secret长度和 要求,随便写一个不行,比如“hello”这样不行,短了不行,比如“abcdefghijklmnopqrstuvwxyz”这个不行。这个是可行的:“whatthefuck123weishenmebuneng123”

坑2:java生成的token,在golang上解析需要encode……如下,直接用byte(secret)不行。

坑3:用URLENcoding不行,要用RawStdEncoding。

代码语言:javascript
复制
// 校验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。如下图:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/10/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档