diff --git a/idp/lark.go b/idp/lark.go index dacbbb49..ecd554cd 100644 --- a/idp/lark.go +++ b/idp/lark.go @@ -27,16 +27,22 @@ import ( ) type LarkIdProvider struct { - Client *http.Client - Config *oauth2.Config + Client *http.Client + Config *oauth2.Config + LarkDomain string } -func NewLarkIdProvider(clientId string, clientSecret string, redirectUrl string) *LarkIdProvider { +func NewLarkIdProvider(clientId string, clientSecret string, redirectUrl string, useGlobalEndpoint bool) *LarkIdProvider { idp := &LarkIdProvider{} + if useGlobalEndpoint { + idp.LarkDomain = "https://open.larksuite.com" + } else { + idp.LarkDomain = "https://open.feishu.cn" + } + config := idp.getConfig(clientId, clientSecret, redirectUrl) idp.Config = config - return idp } @@ -47,7 +53,7 @@ func (idp *LarkIdProvider) SetHttpClient(client *http.Client) { // getConfig return a point of Config, which describes a typical 3-legged OAuth2 flow func (idp *LarkIdProvider) getConfig(clientId string, clientSecret string, redirectUrl string) *oauth2.Config { endpoint := oauth2.Endpoint{ - TokenURL: "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal", + TokenURL: idp.LarkDomain + "/open-apis/auth/v3/tenant_access_token/internal", } config := &oauth2.Config{ @@ -162,6 +168,7 @@ type LarkUserInfo struct { } `json:"data"` } +// GetUserInfo use LarkAccessToken gotten before return LinkedInUserInf // GetUserInfo use LarkAccessToken gotten before return LinkedInUserInfo // get more detail via: https://docs.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin?context=linkedin/consumer/context func (idp *LarkIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) { @@ -175,7 +182,7 @@ func (idp *LarkIdProvider) GetUserInfo(token *oauth2.Token) (*UserInfo, error) { return nil, err } - req, err := http.NewRequest("POST", "https://open.feishu.cn/open-apis/authen/v1/access_token", strings.NewReader(string(data))) + req, err := http.NewRequest("POST", idp.LarkDomain+"/open-apis/authen/v1/access_token", strings.NewReader(string(data))) if err != nil { return nil, err } diff --git a/idp/provider.go b/idp/provider.go index be058af0..d365e707 100644 --- a/idp/provider.go +++ b/idp/provider.go @@ -87,7 +87,7 @@ func GetIdProvider(idpInfo *ProviderInfo, redirectUrl string) (IdProvider, error return nil, fmt.Errorf("WeCom provider subType: %s is not supported", idpInfo.SubType) } case "Lark": - return NewLarkIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl), nil + return NewLarkIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl, idpInfo.DisableSsl), nil case "GitLab": return NewGitlabIdProvider(idpInfo.ClientId, idpInfo.ClientSecret, redirectUrl), nil case "ADFS": diff --git a/web/src/ProviderEditPage.js b/web/src/ProviderEditPage.js index d066d8ef..b5055369 100644 --- a/web/src/ProviderEditPage.js +++ b/web/src/ProviderEditPage.js @@ -931,10 +931,12 @@ class ProviderEditPage extends React.Component { ) } { - this.state.provider.type !== "Google" ? null : ( + this.state.provider.type !== "Google" && this.state.provider.type !== "Lark" ? null : ( - {Setting.getLabel(i18next.t("provider:Get phone number"), i18next.t("provider:Get phone number - Tooltip"))} : + {this.state.provider.type === "Google" ? + Setting.getLabel(i18next.t("provider:Get phone number"), i18next.t("provider:Get phone number - Tooltip")) + : Setting.getLabel(i18next.t("provider:Use global endpoint"), i18next.t("provider:Use global endpoint - Tooltip"))} : { diff --git a/web/src/auth/Provider.js b/web/src/auth/Provider.js index 863e9ec1..6dbde965 100644 --- a/web/src/auth/Provider.js +++ b/web/src/auth/Provider.js @@ -68,6 +68,7 @@ const authInfo = { Lark: { // scope: "email", endpoint: "https://open.feishu.cn/open-apis/authen/v1/index", + endpoint2: "https://accounts.larksuite.com/open-apis/authen/v1/authorize", }, GitLab: { scope: "read_user+profile", @@ -406,6 +407,8 @@ export function getAuthUrl(application, provider, method, code) { if (provider.domain) { endpoint = `${provider.domain}/apps/oauth2/authorize`; } + } else if (provider.type === "Lark" && provider.disableSsl) { + endpoint = authInfo[provider.type].endpoint2; } if (provider.type === "Google" || provider.type === "GitHub" || provider.type === "Facebook" @@ -460,6 +463,9 @@ export function getAuthUrl(application, provider, method, code) { return `https://error:not-supported-provider-sub-type:${provider.subType}`; } } else if (provider.type === "Lark") { + if (provider.disableSsl) { + redirectUri = encodeURIComponent(redirectUri); + } return `${endpoint}?app_id=${provider.clientId}&redirect_uri=${redirectUri}&state=${state}`; } else if (provider.type === "ADFS") { return `${provider.domain}/adfs/oauth2/authorize?client_id=${provider.clientId}&redirect_uri=${redirectUri}&state=${state}&response_type=code&nonce=casdoor&scope=openid`;