diff --git a/router/api-router.go b/router/api-router.go index 3bbac17e..e89ba4e7 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -1,10 +1,11 @@ package router import ( - "github.com/gin-contrib/gzip" - "github.com/gin-gonic/gin" "one-api/controller" "one-api/middleware" + + "github.com/gin-contrib/gzip" + "github.com/gin-gonic/gin" ) func SetApiRouter(router *gin.Engine) { @@ -27,7 +28,7 @@ func SetApiRouter(router *gin.Engine) { userRoute := apiRouter.Group("/user") { userRoute.POST("/register", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Register) - userRoute.POST("/login", middleware.CriticalRateLimit(), controller.Login) + userRoute.POST("/login", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Login) userRoute.GET("/logout", controller.Logout) selfRoute := userRoute.Group("/") diff --git a/web/src/components/LoginForm.js b/web/src/components/LoginForm.js index 52e3c840..d3954cf8 100644 --- a/web/src/components/LoginForm.js +++ b/web/src/components/LoginForm.js @@ -12,7 +12,8 @@ import { } from 'semantic-ui-react'; import { Link, useNavigate, useSearchParams } from 'react-router-dom'; import { UserContext } from '../context/User'; -import { API, getLogo, showError, showSuccess } from '../helpers'; +import { API, getLogo, showError, showSuccess, showInfo } from '../helpers'; +import Turnstile from 'react-turnstile'; const LoginForm = () => { const [inputs, setInputs] = useState({ @@ -24,6 +25,9 @@ const LoginForm = () => { const [submitted, setSubmitted] = useState(false); const { username, password } = inputs; const [userState, userDispatch] = useContext(UserContext); + const [turnstileEnabled, setTurnstileEnabled] = useState(false); + const [turnstileSiteKey, setTurnstileSiteKey] = useState(''); + const [turnstileToken, setTurnstileToken] = useState(''); let navigate = useNavigate(); const [status, setStatus] = useState({}); @@ -37,6 +41,11 @@ const LoginForm = () => { if (status) { status = JSON.parse(status); setStatus(status); + + if (status.turnstile_check) { + setTurnstileEnabled(true); + setTurnstileSiteKey(status.turnstile_site_key); + } } }, []); @@ -76,7 +85,12 @@ const LoginForm = () => { async function handleSubmit(e) { setSubmitted(true); if (username && password) { - const res = await API.post('/api/user/login', { + if (turnstileEnabled && turnstileToken === '') { + showInfo('请稍后几秒重试,Turnstile 正在检查用户环境!'); + return; + } + + const res = await API.post(`/api/user/login?turnstile=${turnstileToken}`, { username, password, }); @@ -119,6 +133,16 @@ const LoginForm = () => { value={password} onChange={handleChange} /> + {turnstileEnabled ? ( + { + setTurnstileToken(token); + }} + /> + ) : ( + <> + )}