fix: fixed an issue where OIDC login consistently used a synthetic email address
This commit is contained in:
@@ -306,7 +306,7 @@ func (h *AuthHandler) OIDCOAuthCallback(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
identityKey := oidcIdentityKey(issuer, subject)
|
identityKey := oidcIdentityKey(issuer, subject)
|
||||||
email := oidcSyntheticEmailFromIdentityKey(identityKey)
|
email := oidcSelectLoginEmail(userInfoClaims.Email, idClaims.Email, identityKey)
|
||||||
username := firstNonEmpty(
|
username := firstNonEmpty(
|
||||||
userInfoClaims.Username,
|
userInfoClaims.Username,
|
||||||
idClaims.PreferredUsername,
|
idClaims.PreferredUsername,
|
||||||
@@ -831,6 +831,14 @@ func oidcSyntheticEmailFromIdentityKey(identityKey string) string {
|
|||||||
return "oidc-" + hex.EncodeToString(sum[:16]) + service.OIDCConnectSyntheticEmailDomain
|
return "oidc-" + hex.EncodeToString(sum[:16]) + service.OIDCConnectSyntheticEmailDomain
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func oidcSelectLoginEmail(userInfoEmail, idTokenEmail, identityKey string) string {
|
||||||
|
email := strings.TrimSpace(firstNonEmpty(userInfoEmail, idTokenEmail))
|
||||||
|
if email != "" {
|
||||||
|
return email
|
||||||
|
}
|
||||||
|
return oidcSyntheticEmailFromIdentityKey(identityKey)
|
||||||
|
}
|
||||||
|
|
||||||
func oidcFallbackUsername(subject string) string {
|
func oidcFallbackUsername(subject string) string {
|
||||||
subject = strings.TrimSpace(subject)
|
subject = strings.TrimSpace(subject)
|
||||||
if subject == "" {
|
if subject == "" {
|
||||||
|
|||||||
@@ -30,6 +30,20 @@ func TestOIDCSyntheticEmailStableAndDistinct(t *testing.T) {
|
|||||||
require.Contains(t, e1, "@oidc-connect.invalid")
|
require.Contains(t, e1, "@oidc-connect.invalid")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOIDCSelectLoginEmailPrefersRealEmail(t *testing.T) {
|
||||||
|
identityKey := oidcIdentityKey("https://issuer.example.com", "subject-a")
|
||||||
|
|
||||||
|
email := oidcSelectLoginEmail("user@example.com", "idtoken@example.com", identityKey)
|
||||||
|
require.Equal(t, "user@example.com", email)
|
||||||
|
|
||||||
|
email = oidcSelectLoginEmail("", "idtoken@example.com", identityKey)
|
||||||
|
require.Equal(t, "idtoken@example.com", email)
|
||||||
|
|
||||||
|
email = oidcSelectLoginEmail("", "", identityKey)
|
||||||
|
require.Contains(t, email, "@oidc-connect.invalid")
|
||||||
|
require.Equal(t, oidcSyntheticEmailFromIdentityKey(identityKey), email)
|
||||||
|
}
|
||||||
|
|
||||||
func TestBuildOIDCAuthorizeURLIncludesNonceAndPKCE(t *testing.T) {
|
func TestBuildOIDCAuthorizeURLIncludesNonceAndPKCE(t *testing.T) {
|
||||||
cfg := config.OIDCConnectConfig{
|
cfg := config.OIDCConnectConfig{
|
||||||
AuthorizeURL: "https://issuer.example.com/auth",
|
AuthorizeURL: "https://issuer.example.com/auth",
|
||||||
|
|||||||
Reference in New Issue
Block a user