-
Notifications
You must be signed in to change notification settings - Fork 27
/
extract.go
67 lines (59 loc) · 1.94 KB
/
extract.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
package stdattrs
func extractString(input map[string]interface{}, output T, key string) {
if value, ok := input[key].(string); ok && value != "" {
output[key] = value
}
}
func extractBool(input map[string]interface{}, output T, key string) {
if value, ok := input[key].(bool); ok {
output[key] = value
}
}
func extractAddress(input map[string]interface{}, output T) {
if inAddr, ok := input[Address].(map[string]interface{}); ok {
outAddr := make(map[string]interface{})
extractString(inAddr, T(outAddr), Formatted)
extractString(inAddr, T(outAddr), StreetAddress)
extractString(inAddr, T(outAddr), Locality)
extractString(inAddr, T(outAddr), Region)
extractString(inAddr, T(outAddr), PostalCode)
extractString(inAddr, T(outAddr), Country)
if len(outAddr) > 0 {
output[Address] = outAddr
}
}
}
type ExtractOptions struct {
EmailRequired bool
}
// Extract extracts OIDC standard claims.
// The output is NOT normalized.
func Extract(claims map[string]interface{}, opts ExtractOptions) (T, error) {
out := T{}
extractString(claims, out, Name)
extractString(claims, out, GivenName)
extractString(claims, out, FamilyName)
extractString(claims, out, MiddleName)
extractString(claims, out, Nickname)
extractString(claims, out, PreferredUsername)
extractString(claims, out, Profile)
extractString(claims, out, Picture)
extractString(claims, out, Website)
extractString(claims, out, Email)
extractBool(claims, out, EmailVerified)
extractString(claims, out, Gender)
extractString(claims, out, Birthdate)
extractString(claims, out, Zoneinfo)
extractString(claims, out, Locale)
extractString(claims, out, PhoneNumber)
extractBool(claims, out, PhoneNumberVerified)
extractAddress(claims, out)
emailOK := false
if email, ok := out[Email].(string); ok && email != "" {
emailOK = true
}
if opts.EmailRequired && !emailOK {
return nil, StandardAttributesEmailRequired.New("claim email is required but it is missing")
}
return out, nil
}