forked from oauth2-proxy/mockoidc
-
Notifications
You must be signed in to change notification settings - Fork 1
/
user.go
83 lines (73 loc) · 2.22 KB
/
user.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package mockoidc
import "encoding/json"
// User represents a mock user that the server will grant Oauth tokens for.
// Calls to the `authorization_endpoint` will pop any mock Users added to the
// `UserQueue`. Otherwise `DefaultUser()` is returned.
type User struct {
ID string
Email string
EmailVerified bool
PreferredUsername string
Phone string
Address string
Groups []string
}
// DefaultUser returns a default User that is set in `authorization_endpoint`
// if the UserQueue is empty.
func DefaultUser() *User {
return &User{
ID: "1234567890",
Email: "jane.doe@example.com",
PreferredUsername: "jane.doe",
Phone: "555-987-6543",
Address: "123 Main Street",
Groups: []string{"engineering", "design"},
EmailVerified: true,
}
}
type userinfo struct {
Email string `json:"email,omitempty"`
PreferredUsername string `json:"preferred_username,omitempty"`
Phone string `json:"phone,omitempty"`
Address string `json:"address,omitempty"`
Groups []string `json:"groups,omitempty"`
}
func (u *User) userinfo(scopes []string) ([]byte, error) {
user := u.scopedClone(scopes)
ui := &userinfo{
Email: user.Email,
PreferredUsername: user.PreferredUsername,
Phone: user.Phone,
Address: user.Address,
Groups: user.Groups,
}
return json.Marshal(ui)
}
func (u *User) populateClaims(scopes []string, claims *idTokenClaims) {
user := u.scopedClone(scopes)
claims.PreferredUsername = user.PreferredUsername
claims.Address = user.Address
claims.Phone = user.Phone
claims.Email = user.Email
claims.EmailVerified = user.EmailVerified
claims.Groups = user.Groups
}
func (u *User) scopedClone(scopes []string) *User {
clone := &User{
ID: u.ID,
}
for _, scope := range scopes {
switch scope {
case "profile":
clone.PreferredUsername = u.PreferredUsername
clone.Address = u.Address
clone.Phone = u.Phone
case "email":
clone.Email = u.Email
clone.EmailVerified = u.EmailVerified
case "groups":
clone.Groups = append(make([]string, 0, len(u.Groups)), u.Groups...)
}
}
return clone
}