https://github.com/dgrijalva/jwt-go
https://github.com/guyan0319/go-sso
https://zhuanlan.zhihu.com/p/187131269
https://gitee.com/lyric/oauth2
实现单点登录
实现单点登录的思路很简单,就是一个账号对应的token同一时间只有一个生效,也就是说每次用户登录除了生成一个token保存起来,还要删除掉之前的token。
用户登录,服务器生成token保存至redis(设置有效时间),并将token返回给前端,用户之后的每次请求需要携带token。
在拦截器中校验请求头中的token,判断token是否有效,每一次有效的请求都刷新token的有效时间。
同一个账号再次被登录时,删除之前的token,并生成新的token重复1操作。
步骤看起来都很简单,但有一个问题需要注意,每一次校验token是需要去redis中查询的,也就是说设置的key应该为token,value为userId(或者其它唯一标识),那么这个时候如何在登录时做到删除当前的token呢?如果只是有一个token-id的对应关系好像确实没办法获取到该账号当前token,所以还需要一个id-token的对应关系,可以直接通过id拿到token。
这里附上我实现token操作部分的代码,拦截器部分可以有很多种实现方式,我是用的echo框架的中间件来实现,如果需要的话评论区说一声我贴上来。
CreateToken(key string, expiration time.Duration) string:创建token,我在创建token的时候就会去判断是否存在旧的token然后删除。
ValidToken(token string) (id int):验证token是否有效,0为失效。
DelToken(token string):删除redis中的token信息。
https://studygolang.com/articles/11794