...
1 package session
2
3 import (
4 "time"
5
6 "edge-infra.dev/pkg/edge/iam/config"
7
8 "github.com/mohae/deepcopy"
9 "github.com/ory/fosite"
10 "github.com/ory/fosite/handler/oauth2"
11 "github.com/ory/fosite/handler/openid"
12 "github.com/ory/fosite/token/jwt"
13 )
14
15 type Session interface {
16 GetSubject() string
17 SetSubject(subject string)
18 SetChallenge(challenge string)
19 SetOrg(value string)
20 SetRls(value string)
21
22 SetGivenName(value string)
23 SetFamilyName(value string)
24 SetFullName(value string)
25 SetDeviceLogin(value string)
26 SetEmail(value string)
27 SetAge(value int)
28 SetAddress(address map[string]interface{})
29
30 AsFosite() fosite.Session
31 AsOpenID() openid.DefaultSession
32 }
33
34 type DefaultSession struct {
35 oauth2.JWTSession
36 openid.DefaultSession
37 fosite.Session
38 }
39
40
41
42
43
44
45
46
47
48 func FromRequester(requester fosite.AccessRequester) Session {
49 return requester.GetSession().(Session)
50 }
51
52 func NewSession(subject string) *DefaultSession {
53 jwtHeaders := jwt.NewHeaders()
54 jwtHeaders.Add("kid", config.PrivateKeyID())
55
56 return &DefaultSession{
57 JWTSession: oauth2.JWTSession{
58 Subject: subject,
59 JWTHeader: jwtHeaders,
60 JWTClaims: &jwt.JWTClaims{
61 Issuer: config.Issuer(),
62 Subject: subject,
63 Extra: map[string]interface{}{
64 "rls": "",
65 "org": config.OrganizationName(),
66 },
67 },
68 },
69 DefaultSession: openid.DefaultSession{
70 Claims: &jwt.IDTokenClaims{
71 Issuer: config.Issuer(),
72 Subject: subject,
73 Audience: []string{},
74 ExpiresAt: time.Now().Add(time.Hour * 6),
75 IssuedAt: time.Now(),
76 RequestedAt: time.Now(),
77 AuthTime: time.Now(),
78 Extra: make(map[string]interface{}),
79 },
80 Headers: jwtHeaders,
81 },
82 }
83 }
84
85 func (s *DefaultSession) AsFosite() fosite.Session {
86 return s
87 }
88
89 func (s *DefaultSession) AsOpenID() openid.DefaultSession {
90 return s.DefaultSession
91 }
92
93 func (s *DefaultSession) SetExpiresAt(key fosite.TokenType, exp time.Time) {
94 s.JWTSession.SetExpiresAt(key, exp)
95 }
96
97 func (s *DefaultSession) GetExpiresAt(key fosite.TokenType) time.Time {
98 return s.JWTSession.GetExpiresAt(key)
99 }
100
101 func (s *DefaultSession) GetUsername() string {
102 return s.JWTSession.Username
103 }
104
105 func (s *DefaultSession) SetSubject(subject string) {
106 s.JWTSession.Subject = subject
107 s.JWTSession.JWTClaims.Subject = subject
108 s.DefaultSession.Subject = subject
109 s.DefaultSession.Claims.Subject = subject
110 }
111 func (s *DefaultSession) SetChallenge(value string) {
112 s.JWTClaims.Add("challenge", value)
113 s.JWTClaims.Extra["challenge"] = value
114 }
115 func (s *DefaultSession) GetChallenge() string {
116 return s.JWTClaims.Extra["challenge"].(string)
117 }
118 func (s *DefaultSession) GetSubject() string {
119 return s.JWTSession.Subject
120 }
121
122 func (s *DefaultSession) Clone() fosite.Session {
123 return deepcopy.Copy(s).(fosite.Session)
124 }
125
126 func (s *DefaultSession) IDTokenClaims() *jwt.IDTokenClaims {
127 return s.DefaultSession.IDTokenClaims()
128 }
129
130 func (s *DefaultSession) IDTokenHeaders() *jwt.Headers {
131 return s.DefaultSession.IDTokenHeaders()
132 }
133
134 func (s *DefaultSession) SetOrg(value string) {
135 s.JWTClaims.Add("org", value)
136 s.JWTClaims.Extra["org"] = value
137
138 }
139
140 func (s *DefaultSession) SetRls(value string) {
141 s.JWTClaims.Add("rls", value)
142 s.JWTClaims.Extra["rls"] = value
143
144 }
145
146
147 func (s *DefaultSession) SetGivenName(value string) {
148 if value != "" {
149 s.DefaultSession.Claims.Extra["given_name"] = value
150 }
151 }
152
153
154 func (s *DefaultSession) SetFamilyName(value string) {
155 if value != "" {
156 s.DefaultSession.Claims.Extra["family_name"] = value
157 }
158 }
159
160
161 func (s *DefaultSession) SetFullName(value string) {
162 if value != "" {
163 s.DefaultSession.Claims.Extra["name"] = value
164 }
165 }
166
167
168 func (s *DefaultSession) SetAge(value int) {
169
170 if value > 0 {
171 s.DefaultSession.Claims.Extra["age"] = value
172 }
173 }
174
175
176 func (s *DefaultSession) SetDeviceLogin(value string) {
177 if value != "" {
178 s.DefaultSession.Claims.Extra["device_login"] = value
179 }
180 }
181
182
183 func (s *DefaultSession) SetEmail(value string) {
184 if value != "" {
185 s.DefaultSession.Claims.Extra["email"] = value
186 }
187 }
188
189
190 func (s *DefaultSession) SetAddress(address map[string]interface{}) {
191 if len(address) > 0 {
192 s.DefaultSession.Claims.Extra["address"] = address
193 }
194 }
195
196 func (s *DefaultSession) SetExtra(key, value string) {
197 s.JWTClaims.Extra[key] = value
198 }
199
View as plain text