...
1
17
18 package jwt
19
20 import (
21 "strconv"
22 "time"
23
24 "gopkg.in/square/go-jose.v2/json"
25 )
26
27
28 type Claims struct {
29 Issuer string `json:"iss,omitempty"`
30 Subject string `json:"sub,omitempty"`
31 Audience Audience `json:"aud,omitempty"`
32 Expiry *NumericDate `json:"exp,omitempty"`
33 NotBefore *NumericDate `json:"nbf,omitempty"`
34 IssuedAt *NumericDate `json:"iat,omitempty"`
35 ID string `json:"jti,omitempty"`
36 }
37
38
39
40
41
42 type NumericDate int64
43
44
45 func NewNumericDate(t time.Time) *NumericDate {
46 if t.IsZero() {
47 return nil
48 }
49
50
51
52
53
54 out := NumericDate(t.Unix())
55 return &out
56 }
57
58
59 func (n NumericDate) MarshalJSON() ([]byte, error) {
60 return []byte(strconv.FormatInt(int64(n), 10)), nil
61 }
62
63
64 func (n *NumericDate) UnmarshalJSON(b []byte) error {
65 s := string(b)
66
67 f, err := strconv.ParseFloat(s, 64)
68 if err != nil {
69 return ErrUnmarshalNumericDate
70 }
71
72 *n = NumericDate(f)
73 return nil
74 }
75
76
77 func (n *NumericDate) Time() time.Time {
78 if n == nil {
79 return time.Time{}
80 }
81 return time.Unix(int64(*n), 0)
82 }
83
84
85 type Audience []string
86
87
88 func (s *Audience) UnmarshalJSON(b []byte) error {
89 var v interface{}
90 if err := json.Unmarshal(b, &v); err != nil {
91 return err
92 }
93
94 switch v := v.(type) {
95 case string:
96 *s = []string{v}
97 case []interface{}:
98 a := make([]string, len(v))
99 for i, e := range v {
100 s, ok := e.(string)
101 if !ok {
102 return ErrUnmarshalAudience
103 }
104 a[i] = s
105 }
106 *s = a
107 default:
108 return ErrUnmarshalAudience
109 }
110
111 return nil
112 }
113
114 func (s Audience) Contains(v string) bool {
115 for _, a := range s {
116 if a == v {
117 return true
118 }
119 }
120 return false
121 }
122
View as plain text