120 lines
2.7 KiB
Go
120 lines
2.7 KiB
Go
package oidc
|
|
|
|
import (
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"golang.org/x/text/language"
|
|
)
|
|
|
|
type Userinfo struct {
|
|
Subject string
|
|
Address *UserinfoAddress
|
|
UserinfoProfile
|
|
UserinfoEmail
|
|
UserinfoPhone
|
|
|
|
claims map[string]interface{}
|
|
}
|
|
|
|
type UserinfoPhone struct {
|
|
PhoneNumber string
|
|
PhoneNumberVerified bool
|
|
}
|
|
type UserinfoProfile struct {
|
|
Name string
|
|
GivenName string
|
|
FamilyName string
|
|
MiddleName string
|
|
Nickname string
|
|
Profile string
|
|
Picture string
|
|
Website string
|
|
Gender Gender
|
|
Birthdate string
|
|
Zoneinfo string
|
|
Locale language.Tag
|
|
UpdatedAt time.Time
|
|
PreferredUsername string
|
|
}
|
|
|
|
type Gender string
|
|
|
|
type UserinfoAddress struct {
|
|
Formatted string
|
|
StreetAddress string
|
|
Locality string
|
|
Region string
|
|
PostalCode string
|
|
Country string
|
|
}
|
|
|
|
type UserinfoEmail struct {
|
|
Email string
|
|
EmailVerified bool
|
|
}
|
|
|
|
func marshalUserinfoProfile(i UserinfoProfile, claims map[string]interface{}) {
|
|
claims["name"] = i.Name
|
|
claims["given_name"] = i.GivenName
|
|
claims["family_name"] = i.FamilyName
|
|
claims["middle_name"] = i.MiddleName
|
|
claims["nickname"] = i.Nickname
|
|
claims["profile"] = i.Profile
|
|
claims["picture"] = i.Picture
|
|
claims["website"] = i.Website
|
|
claims["gender"] = i.Gender
|
|
claims["birthdate"] = i.Birthdate
|
|
claims["Zoneinfo"] = i.Zoneinfo
|
|
claims["locale"] = i.Locale.String()
|
|
claims["updated_at"] = i.UpdatedAt.UTC().Unix()
|
|
claims["preferred_username"] = i.PreferredUsername
|
|
}
|
|
|
|
func marshalUserinfoEmail(i UserinfoEmail, claims map[string]interface{}) {
|
|
if i.Email != "" {
|
|
claims["email"] = i.Email
|
|
}
|
|
if i.EmailVerified {
|
|
claims["email_verified"] = i.EmailVerified
|
|
}
|
|
}
|
|
|
|
func marshalUserinfoAddress(i *UserinfoAddress, claims map[string]interface{}) {
|
|
if i == nil {
|
|
return
|
|
}
|
|
address := make(map[string]interface{})
|
|
if i.Formatted != "" {
|
|
address["formatted"] = i.Formatted
|
|
}
|
|
if i.StreetAddress != "" {
|
|
address["street_address"] = i.StreetAddress
|
|
}
|
|
claims["address"] = address
|
|
}
|
|
|
|
func marshalUserinfoPhone(i UserinfoPhone, claims map[string]interface{}) {
|
|
claims["phone_number"] = i.PhoneNumber
|
|
claims["phone_number_verified"] = i.PhoneNumberVerified
|
|
}
|
|
|
|
func (i *Userinfo) MarshalJSON() ([]byte, error) {
|
|
claims := i.claims
|
|
if claims == nil {
|
|
claims = make(map[string]interface{})
|
|
}
|
|
claims["sub"] = i.Subject
|
|
marshalUserinfoAddress(i.Address, claims)
|
|
marshalUserinfoEmail(i.UserinfoEmail, claims)
|
|
marshalUserinfoPhone(i.UserinfoPhone, claims)
|
|
marshalUserinfoProfile(i.UserinfoProfile, claims)
|
|
return json.Marshal(claims)
|
|
}
|
|
|
|
func (i *Userinfo) UnmmarshalJSON(data []byte) error {
|
|
if err := json.Unmarshal(data, i); err != nil {
|
|
return err
|
|
}
|
|
return json.Unmarshal(data, i.claims)
|
|
}
|