ソースを参照

Merge branch 'main' of github.com:songquanpeng/one-api

JustSong 2 年 前
コミット
74b06b643a
2 ファイル変更30 行追加5 行削除
  1. 4 3
      router/api-router.go
  2. 26 2
      web/src/components/LoginForm.js

+ 4 - 3
router/api-router.go

@@ -1,10 +1,11 @@
 package router
 package router
 
 
 import (
 import (
-	"github.com/gin-contrib/gzip"
-	"github.com/gin-gonic/gin"
 	"one-api/controller"
 	"one-api/controller"
 	"one-api/middleware"
 	"one-api/middleware"
+
+	"github.com/gin-contrib/gzip"
+	"github.com/gin-gonic/gin"
 )
 )
 
 
 func SetApiRouter(router *gin.Engine) {
 func SetApiRouter(router *gin.Engine) {
@@ -27,7 +28,7 @@ func SetApiRouter(router *gin.Engine) {
 		userRoute := apiRouter.Group("/user")
 		userRoute := apiRouter.Group("/user")
 		{
 		{
 			userRoute.POST("/register", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Register)
 			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)
 			userRoute.GET("/logout", controller.Logout)
 
 
 			selfRoute := userRoute.Group("/")
 			selfRoute := userRoute.Group("/")

+ 26 - 2
web/src/components/LoginForm.js

@@ -12,7 +12,8 @@ import {
 } from 'semantic-ui-react';
 } from 'semantic-ui-react';
 import { Link, useNavigate, useSearchParams } from 'react-router-dom';
 import { Link, useNavigate, useSearchParams } from 'react-router-dom';
 import { UserContext } from '../context/User';
 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 LoginForm = () => {
   const [inputs, setInputs] = useState({
   const [inputs, setInputs] = useState({
@@ -24,6 +25,9 @@ const LoginForm = () => {
   const [submitted, setSubmitted] = useState(false);
   const [submitted, setSubmitted] = useState(false);
   const { username, password } = inputs;
   const { username, password } = inputs;
   const [userState, userDispatch] = useContext(UserContext);
   const [userState, userDispatch] = useContext(UserContext);
+  const [turnstileEnabled, setTurnstileEnabled] = useState(false);
+  const [turnstileSiteKey, setTurnstileSiteKey] = useState('');
+  const [turnstileToken, setTurnstileToken] = useState('');
   let navigate = useNavigate();
   let navigate = useNavigate();
 
 
   const [status, setStatus] = useState({});
   const [status, setStatus] = useState({});
@@ -37,6 +41,11 @@ const LoginForm = () => {
     if (status) {
     if (status) {
       status = JSON.parse(status);
       status = JSON.parse(status);
       setStatus(status);
       setStatus(status);
+
+      if (status.turnstile_check) {
+        setTurnstileEnabled(true);
+        setTurnstileSiteKey(status.turnstile_site_key);
+      }
     }
     }
   }, []);
   }, []);
 
 
@@ -76,7 +85,12 @@ const LoginForm = () => {
   async function handleSubmit(e) {
   async function handleSubmit(e) {
     setSubmitted(true);
     setSubmitted(true);
     if (username && password) {
     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,
         username,
         password,
         password,
       });
       });
@@ -119,6 +133,16 @@ const LoginForm = () => {
               value={password}
               value={password}
               onChange={handleChange}
               onChange={handleChange}
             />
             />
+            {turnstileEnabled ? (
+              <Turnstile
+                sitekey={turnstileSiteKey}
+                onVerify={(token) => {
+                  setTurnstileToken(token);
+                }}
+              />
+            ) : (
+              <></>
+            )}
             <Button color="" fluid size="large" onClick={handleSubmit}>
             <Button color="" fluid size="large" onClick={handleSubmit}>
               登录
               登录
             </Button>
             </Button>