diff --git a/internal/controller/connector_controller.go b/internal/controller/connector_controller.go index 28aa5fc6a..c81e644f4 100644 --- a/internal/controller/connector_controller.go +++ b/internal/controller/connector_controller.go @@ -175,6 +175,11 @@ func (cc *ConnectorController) ConnectorRedirect(connector plugin.Connector) (fn ctx.Redirect(http.StatusFound, "/50x") return } + if requirer, ok := connector.(plugin.ConnectorStateRequired); ok && requirer.ConnectorRequireState() && stateInfo == nil { + log.Errorf("missing or invalid connector oauth state for provider %s", connector.ConnectorSlugName()) + ctx.Redirect(http.StatusFound, "/50x") + return + } if stateInfo != nil && stateInfo.Intent == schema.ExternalLoginOAuthStateBindIntent { if err = cc.userExternalService.BindExternalLoginToUser(ctx, stateInfo.UserID, u); err != nil { log.Errorf("bind external login failed: %v", err) diff --git a/internal/router/plugin_api_router.go b/internal/router/plugin_api_router.go index 3b74b3ddd..0a72876d3 100644 --- a/internal/router/plugin_api_router.go +++ b/internal/router/plugin_api_router.go @@ -56,6 +56,7 @@ func (pr *PluginAPIRouter) RegisterUnAuthConnectorRouter(r *gin.RouterGroup) { connectorController := pr.connectorController r.GET(controller.ConnectorLoginRouterPrefix+":name", connectorController.ConnectorLoginDispatcher) r.GET(controller.ConnectorRedirectRouterPrefix+":name", connectorController.ConnectorRedirectDispatcher) + r.POST(controller.ConnectorRedirectRouterPrefix+":name", connectorController.ConnectorRedirectDispatcher) r.GET("/connector/info", connectorController.ConnectorsInfo) r.POST("/connector/binding/email", connectorController.ExternalLoginBindingUserSendEmail) diff --git a/plugin/connector.go b/plugin/connector.go index 267cd3916..cd8468fcb 100644 --- a/plugin/connector.go +++ b/plugin/connector.go @@ -44,6 +44,10 @@ type Connector interface { ConnectorReceiver(ctx *GinContext, receiverURL string) (userInfo ExternalLoginUserInfo, err error) } +type ConnectorStateRequired interface { + ConnectorRequireState() bool +} + // ExternalLoginUserInfo external login user info type ExternalLoginUserInfo struct { // required. The unique user ID provided by the third-party login