Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.6 KiB
94 lines
2.6 KiB
package jwt |
|
|
|
import ( |
|
"encoding/json" |
|
"errors" |
|
// "fmt" |
|
) |
|
|
|
// Claims type that uses the map[string]interface{} for JSON decoding |
|
// This is the default claims type if you don't supply one |
|
type MapClaims map[string]interface{} |
|
|
|
// Compares the aud claim against cmp. |
|
// If required is false, this method will return true if the value matches or is unset |
|
func (m MapClaims) VerifyAudience(cmp string, req bool) bool { |
|
aud, _ := m["aud"].(string) |
|
return verifyAud(aud, cmp, req) |
|
} |
|
|
|
// Compares the exp claim against cmp. |
|
// If required is false, this method will return true if the value matches or is unset |
|
func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool { |
|
switch exp := m["exp"].(type) { |
|
case float64: |
|
return verifyExp(int64(exp), cmp, req) |
|
case json.Number: |
|
v, _ := exp.Int64() |
|
return verifyExp(v, cmp, req) |
|
} |
|
return req == false |
|
} |
|
|
|
// Compares the iat claim against cmp. |
|
// If required is false, this method will return true if the value matches or is unset |
|
func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool { |
|
switch iat := m["iat"].(type) { |
|
case float64: |
|
return verifyIat(int64(iat), cmp, req) |
|
case json.Number: |
|
v, _ := iat.Int64() |
|
return verifyIat(v, cmp, req) |
|
} |
|
return req == false |
|
} |
|
|
|
// Compares the iss claim against cmp. |
|
// If required is false, this method will return true if the value matches or is unset |
|
func (m MapClaims) VerifyIssuer(cmp string, req bool) bool { |
|
iss, _ := m["iss"].(string) |
|
return verifyIss(iss, cmp, req) |
|
} |
|
|
|
// Compares the nbf claim against cmp. |
|
// If required is false, this method will return true if the value matches or is unset |
|
func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool { |
|
switch nbf := m["nbf"].(type) { |
|
case float64: |
|
return verifyNbf(int64(nbf), cmp, req) |
|
case json.Number: |
|
v, _ := nbf.Int64() |
|
return verifyNbf(v, cmp, req) |
|
} |
|
return req == false |
|
} |
|
|
|
// Validates time based claims "exp, iat, nbf". |
|
// There is no accounting for clock skew. |
|
// As well, if any of the above claims are not in the token, it will still |
|
// be considered a valid claim. |
|
func (m MapClaims) Valid() error { |
|
vErr := new(ValidationError) |
|
now := TimeFunc().Unix() |
|
|
|
if m.VerifyExpiresAt(now, false) == false { |
|
vErr.Inner = errors.New("Token is expired") |
|
vErr.Errors |= ValidationErrorExpired |
|
} |
|
|
|
if m.VerifyIssuedAt(now, false) == false { |
|
vErr.Inner = errors.New("Token used before issued") |
|
vErr.Errors |= ValidationErrorIssuedAt |
|
} |
|
|
|
if m.VerifyNotBefore(now, false) == false { |
|
vErr.Inner = errors.New("Token is not valid yet") |
|
vErr.Errors |= ValidationErrorNotValidYet |
|
} |
|
|
|
if vErr.valid() { |
|
return nil |
|
} |
|
|
|
return vErr |
|
}
|
|
|