Skip to content

Commit

Permalink
Add possibility to get additional user data (additional scope) (#163)
Browse files Browse the repository at this point in the history
* Add possibility to get additional user data

* Fix linting

* lint: fix comment

---------

Co-authored-by: Umputun <[email protected]>
  • Loading branch information
VladimirZaets and umputun authored Sep 10, 2023
1 parent cea049c commit ef1a340
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 18 deletions.
40 changes: 30 additions & 10 deletions auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,19 +222,22 @@ func (s *Service) Middleware() middleware.Authenticator {
return s.authMiddleware
}

// AddProvider adds provider for given name
func (s *Service) AddProvider(name, cid, csecret string) {

// AddProviderWithUserAttributes adds provider with user attributes mapping
func (s *Service) AddProviderWithUserAttributes(name, cid, csecret string, userAttributes provider.UserAttributes) {
p := provider.Params{
URL: s.opts.URL,
JwtService: s.jwtService,
Issuer: s.issuer,
AvatarSaver: s.avatarProxy,
Cid: cid,
Csecret: csecret,
L: s.logger,
URL: s.opts.URL,
JwtService: s.jwtService,
Issuer: s.issuer,
AvatarSaver: s.avatarProxy,
Cid: cid,
Csecret: csecret,
L: s.logger,
UserAttributes: userAttributes,
}
s.addProvider(name, p)
}

func (s *Service) addProvider(name string, p provider.Params) {
switch strings.ToLower(name) {
case "github":
s.providers = append(s.providers, provider.NewService(provider.NewGithub(p)))
Expand All @@ -261,6 +264,23 @@ func (s *Service) AddProvider(name, cid, csecret string) {
s.authMiddleware.Providers = s.providers
}

// AddProvider adds provider for given name
func (s *Service) AddProvider(name, cid, csecret string) {

p := provider.Params{
URL: s.opts.URL,
JwtService: s.jwtService,
Issuer: s.issuer,
AvatarSaver: s.avatarProxy,
Cid: cid,
Csecret: csecret,
L: s.logger,
UserAttributes: map[string]string{},
}

s.addProvider(name, p)
}

// AddDevProvider with a custom host and port
func (s *Service) AddDevProvider(host string, port int) {
p := provider.Params{
Expand Down
13 changes: 7 additions & 6 deletions provider/oauth2.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,13 @@ type Oauth2Handler struct {
// Params to make initialized and ready to use provider
type Params struct {
logger.L
URL string
JwtService TokenService
Cid string
Csecret string
Issuer string
AvatarSaver AvatarSaver
URL string
JwtService TokenService
Cid string
Csecret string
Issuer string
AvatarSaver AvatarSaver
UserAttributes UserAttributes

Port int // relevant for providers supporting port customization, for example dev oauth2
Host string // relevant for providers supporting host customization, for example dev oauth2
Expand Down
29 changes: 27 additions & 2 deletions provider/providers.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ import (
"golang.org/x/oauth2/yandex"
)

// UserAttributes is the type that will be used to map user data from provider to token.User
type UserAttributes map[string]string

// NewGoogle makes google oauth2 provider
func NewGoogle(p Params) Oauth2Handler {
return initOauth2Handler(p, Oauth2Handler{
Expand All @@ -34,6 +37,9 @@ func NewGoogle(p Params) Oauth2Handler {
if userInfo.Name == "" {
userInfo.Name = "noname_" + userInfo.ID[8:12]
}
for k, v := range p.UserAttributes {
userInfo.SetStrAttr(v, data.Value(k))
}
return userInfo
},
})
Expand All @@ -56,6 +62,9 @@ func NewGithub(p Params) Oauth2Handler {
if userInfo.Name == "" {
userInfo.Name = data.Value("login")
}
for k, v := range p.UserAttributes {
userInfo.SetStrAttr(v, data.Value(k))
}
return userInfo
},
})
Expand Down Expand Up @@ -93,6 +102,9 @@ func NewFacebook(p Params) Oauth2Handler {
if err := json.Unmarshal(bdata, &uinfoJSON); err == nil {
userInfo.Picture = uinfoJSON.Picture.Data.URL
}
for k, v := range p.UserAttributes {
userInfo.SetStrAttr(v, data.Value(k))
}
return userInfo
},
})
Expand Down Expand Up @@ -121,6 +133,9 @@ func NewYandex(p Params) Oauth2Handler {
if data.Value("default_avatar_id") != "" {
userInfo.Picture = fmt.Sprintf("https://avatars.yandex.net/get-yapic/%s/islands-200", data.Value("default_avatar_id"))
}
for k, v := range p.UserAttributes {
userInfo.SetStrAttr(v, data.Value(k))
}
return userInfo
},
})
Expand All @@ -143,6 +158,9 @@ func NewTwitter(p Params) Oauth1Handler {
if userInfo.Name == "" {
userInfo.Name = data.Value("name")
}
for k, v := range p.UserAttributes {
userInfo.SetStrAttr(v, data.Value(k))
}
return userInfo
},
})
Expand All @@ -164,7 +182,9 @@ func NewBattlenet(p Params) Oauth2Handler {
ID: "battlenet_" + token.HashID(sha1.New(), data.Value("id")),
Name: data.Value("battletag"),
}

for k, v := range p.UserAttributes {
userInfo.SetStrAttr(v, data.Value(k))
}
return userInfo
},
})
Expand All @@ -185,6 +205,9 @@ func NewMicrosoft(p Params) Oauth2Handler {
Name: data.Value("displayName"),
Picture: "https://graph.microsoft.com/beta/me/photo/$value",
}
for k, v := range p.UserAttributes {
userInfo.SetStrAttr(v, data.Value(k))
}
return userInfo
},
})
Expand Down Expand Up @@ -235,7 +258,9 @@ func NewPatreon(p Params) Oauth2Handler {
userInfo.SetPaidSub(true)
}
}

for k, v := range p.UserAttributes {
userInfo.SetStrAttr(v, data.Value(k))
}
return userInfo
},
})
Expand Down

0 comments on commit ef1a340

Please sign in to comment.