From 131820e34e5fe82745781ce2cf46337ce13e2f23 Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Mon, 24 Mar 2025 13:42:35 +0800 Subject: [PATCH] feat: add application.ForcedRedirectOrigin --- object/application.go | 1 + web/src/ApplicationEditPage.js | 10 ++++++++++ web/src/auth/Provider.js | 9 +++++---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/object/application.go b/object/application.go index dded326a..89f9876d 100644 --- a/object/application.go +++ b/object/application.go @@ -101,6 +101,7 @@ type Application struct { ClientId string `xorm:"varchar(100)" json:"clientId"` ClientSecret string `xorm:"varchar(100)" json:"clientSecret"` RedirectUris []string `xorm:"varchar(1000)" json:"redirectUris"` + ForcedRedirectOrigin string `xorm:"varchar(100)" json:"forcedRedirectOrigin"` TokenFormat string `xorm:"varchar(100)" json:"tokenFormat"` TokenSigningMethod string `xorm:"varchar(100)" json:"tokenSigningMethod"` TokenFields []string `xorm:"varchar(1000)" json:"tokenFields"` diff --git a/web/src/ApplicationEditPage.js b/web/src/ApplicationEditPage.js index 62f31f2d..f917fcfe 100644 --- a/web/src/ApplicationEditPage.js +++ b/web/src/ApplicationEditPage.js @@ -410,6 +410,16 @@ class ApplicationEditPage extends React.Component { /> + + + {Setting.getLabel(i18next.t("application:Forced redirect origin"), i18next.t("general:Forced redirect origin - Tooltip"))} : + + + } value={this.state.application.forcedRedirectOrigin} onChange={e => { + this.updateApplicationField("forcedRedirectOrigin", e.target.value); + }} /> + + {Setting.getLabel(i18next.t("application:Token format"), i18next.t("application:Token format - Tooltip"))} : diff --git a/web/src/auth/Provider.js b/web/src/auth/Provider.js index ac7fac2a..2f1c83a4 100644 --- a/web/src/auth/Provider.js +++ b/web/src/auth/Provider.js @@ -387,7 +387,8 @@ export function getAuthUrl(application, provider, method, code) { } let endpoint = authInfo[provider.type].endpoint; - let redirectUri = `${window.location.origin}/callback`; + const redirectOrigin = application.forcedRedirectOrigin ? application.forcedRedirectOrigin : window.location.origin; + let redirectUri = `${redirectOrigin}/callback`; let scope = authInfo[provider.type].scope; const isShortState = (provider.type === "WeChat" && navigator.userAgent.includes("MicroMessenger")) || (provider.type === "Twitter"); const state = Util.getStateFromQueryParams(application.name, provider.name, method, isShortState); @@ -398,7 +399,7 @@ export function getAuthUrl(application, provider, method, code) { endpoint = endpoint.replace("common", provider.domain); } } else if (provider.type === "Apple") { - redirectUri = `${window.location.origin}/api/callback`; + redirectUri = `${redirectOrigin}/api/callback`; } else if (provider.type === "Google" && provider.disableSsl) { scope += "+https://www.googleapis.com/auth/user.phonenumbers.read"; } @@ -426,7 +427,7 @@ export function getAuthUrl(application, provider, method, code) { return `${authInfo[provider.type].mpEndpoint}?appid=${provider.clientId2}&redirect_uri=${redirectUri}&state=${state}&scope=${authInfo[provider.type].mpScope}&response_type=code#wechat_redirect`; } else { if (provider.clientId2 && provider?.disableSsl && provider?.signName === "media") { - return `${window.location.origin}/callback?state=${state}&code=${"wechat_oa:" + code}`; + return `${redirectOrigin}/callback?state=${state}&code=${"wechat_oa:" + code}`; } return `${endpoint}?appid=${provider.clientId}&redirect_uri=${redirectUri}&scope=${scope}&response_type=code&state=${state}#wechat_redirect`; } @@ -469,7 +470,7 @@ export function getAuthUrl(application, provider, method, code) { } else if (provider.type === "Apple") { return `${endpoint}?client_id=${provider.clientId}&redirect_uri=${redirectUri}&state=${state}&response_type=code%20id_token&scope=${scope}&response_mode=form_post`; } else if (provider.type === "Steam") { - return `${endpoint}?openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&openid.identity=http://specs.openid.net/auth/2.0/identifier_select&openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.realm=${window.location.origin}&openid.return_to=${redirectUri}?state=${state}`; + return `${endpoint}?openid.claimed_id=http://specs.openid.net/auth/2.0/identifier_select&openid.identity=http://specs.openid.net/auth/2.0/identifier_select&openid.mode=checkid_setup&openid.ns=http://specs.openid.net/auth/2.0&openid.realm=${redirectOrigin}&openid.return_to=${redirectUri}?state=${state}`; } else if (provider.type === "Okta") { return `${provider.domain}/v1/authorize?client_id=${provider.clientId}&redirect_uri=${redirectUri}&state=${state}&response_type=code&scope=${scope}`; } else if (provider.type === "Douyin" || provider.type === "TikTok") {