userinfo and more
This commit is contained in:
parent
7210be8e4b
commit
85814fb69a
12 changed files with 702 additions and 134 deletions
233
pkg/oidc/userinfo.go
Normal file
233
pkg/oidc/userinfo.go
Normal file
|
@ -0,0 +1,233 @@
|
|||
package oidc
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Test struct {
|
||||
Userinfo
|
||||
Add string `json:"add,omitempty"`
|
||||
}
|
||||
|
||||
type Userinfo struct {
|
||||
Subject string
|
||||
Address *UserinfoAddress
|
||||
UserinfoProfile
|
||||
UserinfoEmail
|
||||
UserinfoPhone
|
||||
|
||||
claims map[string]interface{}
|
||||
}
|
||||
|
||||
// type UserinfoJSON struct {
|
||||
// Subject string `json:"subject,omitempty"`
|
||||
// Address *UserinfoAddress `json:"address,omitempty"`
|
||||
// Email string `json:"email,omitempty"`
|
||||
// EmailVerified bool `json:"email_verified,omitempty"`
|
||||
// UserinfoProfileJSON
|
||||
// PhoneNumber string `json:"phone_number,omitempty"`
|
||||
// PhoneNumberVerified bool `json:"phone_number_verified,omitempty"`
|
||||
|
||||
// Claims map[string]interface{} `json:",omitempty"`
|
||||
// }
|
||||
|
||||
// type 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
|
||||
}
|
||||
|
||||
// func (i *UserinfoProfile) MarshalJSON() ([]byte, error) {
|
||||
// j := new(UserinfoProfileJSON)
|
||||
// j.UpdatedAt = i.UpdatedAt
|
||||
// return json.Marshal(j)
|
||||
// }
|
||||
|
||||
type UserinfoProfileJSON struct {
|
||||
Name string `json:"name,omitempty"`
|
||||
GivenName string `json:"given_name,omitempty"`
|
||||
FamilyName string `json:"family_name,omitempty"`
|
||||
MiddleName string `json:"middle_name,omitempty"`
|
||||
Nickname string `json:"nickname,omitempty"`
|
||||
Profile string `json:"profile,omitempty"`
|
||||
Picture string `json:"picture,omitempty"`
|
||||
Website string `json:"website,omitempty"`
|
||||
Gender Gender `json:"gender,omitempty"`
|
||||
Birthdate string `json:"birthdate,omitempty"`
|
||||
Zoneinfo string `json:"zoneinfo,omitempty"`
|
||||
// Locale language.Tag `json:"locale,omitempty"`
|
||||
UpdatedAt int64 `json:"updated_at,omitempty"`
|
||||
PreferredUsername string `json:"preferred_username,omitempty"`
|
||||
}
|
||||
|
||||
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["updated_at"] = i.UpdatedAt.UTC().Unix()
|
||||
}
|
||||
|
||||
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
|
||||
// claims["email_verified"] = i.EmailVerified
|
||||
}
|
||||
|
||||
func marshalUserinfoPhone(i UserinfoPhone, claims map[string]interface{}) {
|
||||
claims["phone_number"] = i.PhoneNumber
|
||||
claims["phone_number_verified"] = i.PhoneNumberVerified
|
||||
}
|
||||
|
||||
// func copyClaims(j *Claims, i map[string]interface{}) {
|
||||
// // *j, _ = json.Marshal(i)
|
||||
// }
|
||||
|
||||
// func (p Userinfo) MarshalJSON() ([]byte, error) {
|
||||
// j := new(UserinfoJSON)
|
||||
// j.Subject = p.Subject
|
||||
// b, _ := json.Marshal(j)
|
||||
|
||||
// var m map[string]json.RawMessage
|
||||
// json.Unmarshal(b, &m)
|
||||
|
||||
// // Add tags to the map, possibly overriding struct fields
|
||||
// // for k, v := range p.Claims {
|
||||
// // // if overriding struct fields is not acceptable:
|
||||
// // // if _, ok := m[k]; ok { continue }
|
||||
// // b, _ = json.Marshal(v)
|
||||
// // ms[k] = json.RawMessage(b)
|
||||
// // }
|
||||
|
||||
// return json.Marshal(m)
|
||||
// }
|
||||
|
||||
func (i *Userinfo) MarshalJSON() ([]byte, error) {
|
||||
claims := i.claims
|
||||
if claims == nil {
|
||||
claims = make(map[string]interface{})
|
||||
}
|
||||
// j := new(UserinfoJSON)
|
||||
// j.Subject = i.Subject
|
||||
// j.Address = i.Address
|
||||
// j.Email = i.Email
|
||||
// j.EmailVerified = i.EmailVerified
|
||||
// j.PhoneNumber = i.PhoneNumber
|
||||
// j.PhoneNumberVerified = i.PhoneNumberVerified
|
||||
|
||||
// j.Claims = make(map[string]interface{})
|
||||
// claims := map[string]interface{}{
|
||||
// "sdsa": "jajfi",
|
||||
// "a23r": "",
|
||||
// }
|
||||
|
||||
// j.Claims["Sdsa"] = "sads"
|
||||
// j.Claims["3454"] = ""
|
||||
|
||||
// st := new(structpb.Struct)
|
||||
// b, _ := json.Marshal(j)
|
||||
// err := jsonpb.Unmarshal(bytes.NewReader(b), st)
|
||||
// if err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// fmt.Println("st", st)
|
||||
// m := new(jsonpb.Marshaler)
|
||||
// m.EmitDefaults = false
|
||||
// s, _ := m.MarshalToString(st)
|
||||
// return []byte(s), nil
|
||||
|
||||
// claims["phone_number"] = i.PhoneNumber
|
||||
claims["sub"] = i.Subject
|
||||
marshalUserinfoAddress(i.Address, claims)
|
||||
marshalUserinfoEmail(i.UserinfoEmail, claims)
|
||||
marshalUserinfoPhone(i.UserinfoPhone, claims)
|
||||
marshalUserinfoProfile(i.UserinfoProfile, claims)
|
||||
|
||||
// for k, v := range claims {
|
||||
// j.Claims[k] = v
|
||||
// }
|
||||
// j.Claims = Claims(m)
|
||||
// copyClaims(&j.Claims, i.Claims)
|
||||
// j.Claims, _ = json.Marshal(i.Claims)
|
||||
|
||||
// j.Subject = i.Subject
|
||||
|
||||
// if j.Claims == nil {
|
||||
// j.Claims = make(map[string]interface{})
|
||||
// }
|
||||
// j.Claims["sub"] = i.Subject
|
||||
// if i.Address != nil {
|
||||
// j.Claims["address"] = i.Address
|
||||
// }
|
||||
// if i.Email != "" {
|
||||
// j.Claims["email"] = i.Email
|
||||
// }
|
||||
// if i.EmailVerified {
|
||||
// j.Claims["email_verified"] = i.EmailVerified
|
||||
// }
|
||||
// if i.PhoneNumber != "" {
|
||||
// j.Claims["phone_number"] = i.PhoneNumber
|
||||
// }
|
||||
// if i.PhoneNumberVerified {
|
||||
// j.Claims["phone_number_verified"] = i.PhoneNumberVerified
|
||||
// }
|
||||
// if !i.UpdatedAt.IsZero() {
|
||||
// j.Claims["updated_at"] = i.UpdatedAt.UTC().Unix()
|
||||
// }
|
||||
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)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue