blob: 291213c460d45e44a000d30d916162c0c499355a [file] [log] [blame]
khenaidooffe076b2019-01-15 16:08:08 -05001package jwt
2
3import (
4 "encoding/json"
5 "errors"
6 // "fmt"
7)
8
9// Claims type that uses the map[string]interface{} for JSON decoding
10// This is the default claims type if you don't supply one
11type MapClaims map[string]interface{}
12
13// Compares the aud claim against cmp.
14// If required is false, this method will return true if the value matches or is unset
15func (m MapClaims) VerifyAudience(cmp string, req bool) bool {
16 aud, _ := m["aud"].(string)
17 return verifyAud(aud, cmp, req)
18}
19
20// Compares the exp claim against cmp.
21// If required is false, this method will return true if the value matches or is unset
22func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool {
23 switch exp := m["exp"].(type) {
24 case float64:
25 return verifyExp(int64(exp), cmp, req)
26 case json.Number:
27 v, _ := exp.Int64()
28 return verifyExp(v, cmp, req)
29 }
30 return req == false
31}
32
33// Compares the iat claim against cmp.
34// If required is false, this method will return true if the value matches or is unset
35func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool {
36 switch iat := m["iat"].(type) {
37 case float64:
38 return verifyIat(int64(iat), cmp, req)
39 case json.Number:
40 v, _ := iat.Int64()
41 return verifyIat(v, cmp, req)
42 }
43 return req == false
44}
45
46// Compares the iss claim against cmp.
47// If required is false, this method will return true if the value matches or is unset
48func (m MapClaims) VerifyIssuer(cmp string, req bool) bool {
49 iss, _ := m["iss"].(string)
50 return verifyIss(iss, cmp, req)
51}
52
53// Compares the nbf claim against cmp.
54// If required is false, this method will return true if the value matches or is unset
55func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool {
56 switch nbf := m["nbf"].(type) {
57 case float64:
58 return verifyNbf(int64(nbf), cmp, req)
59 case json.Number:
60 v, _ := nbf.Int64()
61 return verifyNbf(v, cmp, req)
62 }
63 return req == false
64}
65
66// Validates time based claims "exp, iat, nbf".
67// There is no accounting for clock skew.
68// As well, if any of the above claims are not in the token, it will still
69// be considered a valid claim.
70func (m MapClaims) Valid() error {
71 vErr := new(ValidationError)
72 now := TimeFunc().Unix()
73
74 if m.VerifyExpiresAt(now, false) == false {
75 vErr.Inner = errors.New("Token is expired")
76 vErr.Errors |= ValidationErrorExpired
77 }
78
79 if m.VerifyIssuedAt(now, false) == false {
80 vErr.Inner = errors.New("Token used before issued")
81 vErr.Errors |= ValidationErrorIssuedAt
82 }
83
84 if m.VerifyNotBefore(now, false) == false {
85 vErr.Inner = errors.New("Token is not valid yet")
86 vErr.Errors |= ValidationErrorNotValidYet
87 }
88
89 if vErr.valid() {
90 return nil
91 }
92
93 return vErr
94}