package jwt
import (
"encoding/json"
"errors"
"time"
)
type MapClaims map [string ]interface {}
func (m MapClaims ) VerifyAudience (cmp string , req bool ) bool {
var aud []string
switch v := m ["aud" ].(type ) {
case string :
aud = append (aud , v )
case []string :
aud = v
case []interface {}:
for _ , a := range v {
vs , ok := a .(string )
if !ok {
return false
}
aud = append (aud , vs )
}
}
return verifyAud (aud , cmp , req )
}
func (m MapClaims ) VerifyExpiresAt (cmp int64 , req bool ) bool {
cmpTime := time .Unix (cmp , 0 )
v , ok := m ["exp" ]
if !ok {
return !req
}
switch exp := v .(type ) {
case float64 :
if exp == 0 {
return verifyExp (nil , cmpTime , req )
}
return verifyExp (&newNumericDateFromSeconds (exp ).Time , cmpTime , req )
case json .Number :
v , _ := exp .Float64 ()
return verifyExp (&newNumericDateFromSeconds (v ).Time , cmpTime , req )
}
return false
}
func (m MapClaims ) VerifyIssuedAt (cmp int64 , req bool ) bool {
cmpTime := time .Unix (cmp , 0 )
v , ok := m ["iat" ]
if !ok {
return !req
}
switch iat := v .(type ) {
case float64 :
if iat == 0 {
return verifyIat (nil , cmpTime , req )
}
return verifyIat (&newNumericDateFromSeconds (iat ).Time , cmpTime , req )
case json .Number :
v , _ := iat .Float64 ()
return verifyIat (&newNumericDateFromSeconds (v ).Time , cmpTime , req )
}
return false
}
func (m MapClaims ) VerifyNotBefore (cmp int64 , req bool ) bool {
cmpTime := time .Unix (cmp , 0 )
v , ok := m ["nbf" ]
if !ok {
return !req
}
switch nbf := v .(type ) {
case float64 :
if nbf == 0 {
return verifyNbf (nil , cmpTime , req )
}
return verifyNbf (&newNumericDateFromSeconds (nbf ).Time , cmpTime , req )
case json .Number :
v , _ := nbf .Float64 ()
return verifyNbf (&newNumericDateFromSeconds (v ).Time , cmpTime , req )
}
return false
}
func (m MapClaims ) VerifyIssuer (cmp string , req bool ) bool {
iss , _ := m ["iss" ].(string )
return verifyIss (iss , cmp , req )
}
func (m MapClaims ) Valid () error {
vErr := new (ValidationError )
now := TimeFunc ().Unix ()
if !m .VerifyExpiresAt (now , false ) {
vErr .Inner = errors .New ("Token is expired" )
vErr .Errors |= ValidationErrorExpired
}
if !m .VerifyIssuedAt (now , false ) {
vErr .Inner = errors .New ("Token used before issued" )
vErr .Errors |= ValidationErrorIssuedAt
}
if !m .VerifyNotBefore (now , false ) {
vErr .Inner = errors .New ("Token is not valid yet" )
vErr .Errors |= ValidationErrorNotValidYet
}
if vErr .valid () {
return nil
}
return vErr
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .