golang中的jwt使用教程流程分析(go语言指针运算)干货满满

随心笔谈1年前 (2023)发布 admin
120 0

func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc, options …ParserOption) (*Token, error) {
// 创建解析器,
//ParseWithClaims 解析token字符串
return NewParser(options…).ParseWithClaims(tokenString, claims, keyFunc)
}
func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) {
// 解析字符串,将根据.进行切割,通过base64进行解码,根据header中的alg属性获取加密方法比如sha256
// 返回值token为Token结构体,parts为字符串切割后的数组
token, parts, err :=p.ParseUnverified(tokenString, claims)
if err !=nil {
return token, err
}
// 判断是否指定校验方法
if p.ValidMethods !=nil {
var signingMethodValid=false
var alg=token.Method.Alg()
for _, m :=range p.ValidMethods {
if m==alg {
signingMethodValid=true
break
}
}
if !signingMethodValid {
// 指定方法与token中的方法不一致
return token, NewValidationError(fmt.Sprintf(“signing method %v is invalid”, alg), ValidationErrorSignatureInvalid)
}
}
// 获取key秘钥
var key interface{}
// 判断是否实现keyfunc,就是第三个参数
if keyFunc==nil {
// keyFunc was not provided. short circuiting validation
return token, NewValidationError(“no Keyfunc was provided.”, ValidationErrorUnverifiable)
}
// 调用方法,返回key值
if key, err=keyFunc(token); err !=nil {
// keyFunc returned an error
if ve, ok :=err.(*ValidationError); ok {
return token, ve
}
return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable}
}
vErr :=&ValidationError{}
// 判断是否进行校验,SkipClaimsValidation默认为false 加上!成为true
if !p.SkipClaimsValidation {
if err :=token.Claims.Valid(); err !=nil {
// If the Claims Valid returned an error, check if it is a validation error,
// If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set
if e, ok :=err.(*ValidationError); !ok {
vErr=&ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid}
} else {
vErr=e
}
}
}
// 进行签名验证
token.Signature=parts[2]
if err=token.Method.Verify(strings.Join(parts[0:2], “.”), token.Signature, key); err !=nil {
vErr.Inner=err
vErr.Errors |=ValidationErrorSignatureInvalid
}
if vErr.valid() {
token.Valid=true
return token, nil
}
return token, vErr
}

© 版权声明

相关文章