对于请求头Authorization
中token的解析,内部实现了jwt密钥的无感更新
const (
key = "14F17379-EB8F-411B-8F12-6929002DCA76"
prevKey = "B63F477D-BBA3-4E52-96D3-C0034C27694A"
)
func main() {
req := httptest.NewRequest(http.MethodGet, "http://localhost", nil)
//生成token
token, err := buildToken(key, map[string]interface{}{
"key": "value",
}, 3600)
req.Header.Set("Authorization", "Bearer "+token)
//初始化
parser := NewTokenParser(WithResetDuration(time.Minute))
//token解析
tok, err := parser.ParseToken(req, key, prevKey)
}
func (tp *TokenParser) ParseToken(r *http.Request, secret, prevSecret string){
//.....
if len(prevSecret) > 0 {
count := tp.loadCount(secret)
prevCount := tp.loadCount(prevSecret)
var first, second string
if count > prevCount {
first = secret
second = prevSecret
} else {
first = prevSecret
second = secret
}
token, err = tp.doParseToken(r, first)
if err != nil {
token, err = tp.doParseToken(r, second)
if err != nil {
return nil, err
} else {
tp.incrementCount(second)
}
} else {
tp.incrementCount(first)
}
} else {
token, err = tp.doParseToken(r, secret)
if err != nil {
return nil, err
}
}
//.....
}
对比新旧密钥的历史使用次数,先用被使用次数多的密钥解析,不成功在使用使用次数少密钥的解析,有效减少token的被解析次数
func WithResetDuration(duration time.Duration) ParseOption {
return func(parser *TokenParser) {
parser.resetDuration = duration
}
}
用于对jwt密钥使用次数数据的清理