feat: add useIdAsName field for WeCom OAuth provider (#3797)

This commit is contained in:
DacongDA 2025-05-17 02:27:06 +08:00 committed by GitHub
parent d772b0b7a8
commit 4260efcfd0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 49 additions and 21 deletions

View File

@ -44,6 +44,7 @@ type ProviderInfo struct {
AppId string AppId string
HostUrl string HostUrl string
RedirectUrl string RedirectUrl string
DisableSsl bool
TokenURL string TokenURL string
AuthURL string AuthURL string
@ -79,9 +80,9 @@ func GetIdProvider(idpInfo *ProviderInfo, redirectUrl string) (IdProvider, error
return NewLinkedInIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl), nil return NewLinkedInIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl), nil
case "WeCom": case "WeCom":
if idpInfo.SubType == "Internal" { if idpInfo.SubType == "Internal" {
return NewWeComInternalIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl), nil return NewWeComInternalIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl, idpInfo.DisableSsl), nil
} else if idpInfo.SubType == "Third-party" { } else if idpInfo.SubType == "Third-party" {
return NewWeComIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl), nil return NewWeComIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl, idpInfo.DisableSsl), nil
} else { } else {
return nil, fmt.Errorf("WeCom provider subType: %s is not supported", idpInfo.SubType) return nil, fmt.Errorf("WeCom provider subType: %s is not supported", idpInfo.SubType)
} }

View File

@ -29,13 +29,16 @@ import (
type WeComInternalIdProvider struct { type WeComInternalIdProvider struct {
Client *http.Client Client *http.Client
Config *oauth2.Config Config *oauth2.Config
UseIdAsName bool
} }
func NewWeComInternalIdProvider(clientId string, clientSecret string, redirectUrl string) *WeComInternalIdProvider { func NewWeComInternalIdProvider(clientId string, clientSecret string, redirectUrl string, useIdAsName bool) *WeComInternalIdProvider {
idp := &WeComInternalIdProvider{} idp := &WeComInternalIdProvider{}
config := idp.getConfig(clientId, clientSecret, redirectUrl) config := idp.getConfig(clientId, clientSecret, redirectUrl)
idp.Config = config idp.Config = config
idp.UseIdAsName = useIdAsName
return idp return idp
} }
@ -169,5 +172,9 @@ func (idp *WeComInternalIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo,
userInfo.Id = userInfo.Username userInfo.Id = userInfo.Username
} }
if idp.UseIdAsName {
userInfo.Username = userInfo.Id
}
return &userInfo, nil return &userInfo, nil
} }

View File

@ -28,13 +28,16 @@ import (
type WeComIdProvider struct { type WeComIdProvider struct {
Client *http.Client Client *http.Client
Config *oauth2.Config Config *oauth2.Config
UseIdAsName bool
} }
func NewWeComIdProvider(clientId string, clientSecret string, redirectUrl string) *WeComIdProvider { func NewWeComIdProvider(clientId string, clientSecret string, redirectUrl string, useIdAsName bool) *WeComIdProvider {
idp := &WeComIdProvider{} idp := &WeComIdProvider{}
config := idp.getConfig(clientId, clientSecret, redirectUrl) config := idp.getConfig(clientId, clientSecret, redirectUrl)
idp.Config = config idp.Config = config
idp.UseIdAsName = useIdAsName
return idp return idp
} }
@ -183,6 +186,10 @@ func (idp *WeComIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error)
DisplayName: wecomUserInfo.UserInfo.Name, DisplayName: wecomUserInfo.UserInfo.Name,
AvatarUrl: wecomUserInfo.UserInfo.Avatar, AvatarUrl: wecomUserInfo.UserInfo.Avatar,
} }
if idp.UseIdAsName {
userInfo.Username = userInfo.Id
}
return &userInfo, nil return &userInfo, nil
} }

View File

@ -475,6 +475,7 @@ func FromProviderToIdpInfo(ctx *context.Context, provider *Provider) *idp.Provid
AuthURL: provider.CustomAuthUrl, AuthURL: provider.CustomAuthUrl,
UserInfoURL: provider.CustomUserInfoUrl, UserInfoURL: provider.CustomUserInfoUrl,
UserMapping: provider.UserMapping, UserMapping: provider.UserMapping,
DisableSsl: provider.DisableSsl,
} }
if provider.Type == "WeChat" { if provider.Type == "WeChat" {

View File

@ -692,23 +692,35 @@ class ProviderEditPage extends React.Component {
</Row> </Row>
{ {
this.state.provider.type !== "WeCom" ? null : ( this.state.provider.type !== "WeCom" ? null : (
<Row style={{marginTop: "20px"}} > <React.Fragment>
<Col style={{marginTop: "5px"}} span={2}> <Row style={{marginTop: "20px"}} >
{Setting.getLabel(i18next.t("general:Method"), i18next.t("provider:Method - Tooltip"))} : <Col style={{marginTop: "5px"}} span={2}>
</Col> {Setting.getLabel(i18next.t("general:Method"), i18next.t("provider:Method - Tooltip"))} :
<Col span={22} > </Col>
<Select virtual={false} style={{width: "100%"}} value={this.state.provider.method} onChange={value => { <Col span={22} >
this.updateProviderField("method", value); <Select virtual={false} style={{width: "100%"}} value={this.state.provider.method} onChange={value => {
}}> this.updateProviderField("method", value);
{ }}>
[ {
{id: "Normal", name: i18next.t("provider:Normal")}, [
{id: "Silent", name: i18next.t("provider:Silent")}, {id: "Normal", name: i18next.t("provider:Normal")},
].map((method, index) => <Option key={index} value={method.id}>{method.name}</Option>) {id: "Silent", name: i18next.t("provider:Silent")},
} ].map((method, index) => <Option key={index} value={method.id}>{method.name}</Option>)
</Select> }
</Col> </Select>
</Row>) </Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={2}>
{Setting.getLabel(i18next.t("provider:Use id as name"), i18next.t("provider:Use id as name - Tooltip"))} :
</Col>
<Col span={22} >
<Switch checked={this.state.provider.disableSsl} onChange={checked => {
this.updateProviderField("disableSsl", checked);
}} />
</Col>
</Row>
</React.Fragment>)
} }
</React.Fragment> </React.Fragment>
) )