Add preferred username option for SSO

This commit is contained in:
thepaperpilot 2024-04-20 20:47:16 -05:00
parent f56408b8a9
commit 72a628362d
3 changed files with 19 additions and 2 deletions

View file

@ -22,11 +22,13 @@ const (
OAuth2UsernameNickname OAuth2UsernameType = "nickname" OAuth2UsernameNickname OAuth2UsernameType = "nickname"
// OAuth2UsernameEmail username of oauth2 email field will be used as gitea name // OAuth2UsernameEmail username of oauth2 email field will be used as gitea name
OAuth2UsernameEmail OAuth2UsernameType = "email" OAuth2UsernameEmail OAuth2UsernameType = "email"
// @OAuth2UsernamePreferredUsername oauth2 preferred_username field will be used as gitea name
OAuth2UsernamePreferredUsername OAuth2UsernameType = "username"
) )
func (username OAuth2UsernameType) isValid() bool { func (username OAuth2UsernameType) isValid() bool {
switch username { switch username {
case OAuth2UsernameUserid, OAuth2UsernameNickname, OAuth2UsernameEmail: case OAuth2UsernameUserid, OAuth2UsernameNickname, OAuth2UsernameEmail, OAuth2UsernamePreferredUsername:
return true return true
} }
return false return false

View file

@ -387,7 +387,20 @@ func handleSignInFull(ctx *context.Context, u *user_model.User, remember, obeyRe
} }
func getUserName(gothUser *goth.User) (string, error) { func getUserName(gothUser *goth.User) (string, error) {
return user_model.NormalizeUserName(strings.Split(gothUser.RawData["preferred_username"].(string), "@")[0]) switch setting.OAuth2Client.Username {
case setting.OAuth2UsernamePreferredUsername:
username := gothUser.RawData["preferred_username"].(string)
if strings.containsAny(username, "@") {
return user_model.NormalizeUserName(strings.Split(username, "@")[0])
}
return user_model.NormalizeUserName(username)
case setting.OAuth2UsernameEmail:
return user_model.NormalizeUserName(strings.Split(gothUser.Email, "@")[0])
case setting.OAuth2UsernameNickname:
return user_model.NormalizeUserName(gothUser.NickName)
default: // OAuth2UsernameUserid
return gothUser.UserID, nil
}
} }
// HandleSignOut resets the session and sets the cookies // HandleSignOut resets the session and sets the cookies

View file

@ -959,6 +959,8 @@ func SignInOAuthCallback(ctx *context.Context) {
} }
if setting.OAuth2Client.Username == setting.OAuth2UsernameNickname && gothUser.NickName == "" { if setting.OAuth2Client.Username == setting.OAuth2UsernameNickname && gothUser.NickName == "" {
missingFields = append(missingFields, "nickname") missingFields = append(missingFields, "nickname")
} else if setting.OAuth2Client.Username == setting.OAuth2UsernamePreferredUsername && gothUser.RawData["preferred_username"].(string) == "" {
missingFields = append(missingFields, "preferred_nickname")
} }
if len(missingFields) > 0 { if len(missingFields) > 0 {
// we don't have enough information to create an account automatically, // we don't have enough information to create an account automatically,