171 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package basic
 | ||
| 
 | ||
| import (
 | ||
| 	"errors"
 | ||
| 
 | ||
| 	"fusenapi/shared"
 | ||
| 	"fusenapi/utils/auth"
 | ||
| 	"net/http"
 | ||
| 	"reflect"
 | ||
| 
 | ||
| 	"github.com/golang-jwt/jwt"
 | ||
| 	"github.com/zeromicro/go-zero/core/logx"
 | ||
| 	"github.com/zeromicro/go-zero/rest/httpx"
 | ||
| 	"gorm.io/gorm"
 | ||
| )
 | ||
| 
 | ||
| var DefaultJwtSecret uint64 = 21321321321
 | ||
| 
 | ||
| type IJWTParse interface {
 | ||
| 	ParseJwtToken(r *http.Request) (jwt.MapClaims, error)
 | ||
| }
 | ||
| 
 | ||
| func BeforeLogic(w http.ResponseWriter, r *http.Request, l reflect.Value) (isNext bool) {
 | ||
| 
 | ||
| 	m := l.MethodByName("BeforeLogic")
 | ||
| 	if m.IsValid() {
 | ||
| 		result := m.Call([]reflect.Value{reflect.ValueOf(w), reflect.ValueOf(r)})
 | ||
| 		if len(result) != 0 {
 | ||
| 			return false
 | ||
| 		}
 | ||
| 	}
 | ||
| 	return true
 | ||
| }
 | ||
| 
 | ||
| func AfterLogic(w http.ResponseWriter, r *http.Request, l reflect.Value, resp *Response) bool {
 | ||
| 
 | ||
| 	m := l.MethodByName("AfterLogic")
 | ||
| 	if m.IsValid() {
 | ||
| 		m.Call([]reflect.Value{reflect.ValueOf(w), reflect.ValueOf(r), reflect.ValueOf(resp)})
 | ||
| 		return true
 | ||
| 	}
 | ||
| 	return false
 | ||
| }
 | ||
| 
 | ||
| func NormalAfterLogic(w http.ResponseWriter, r *http.Request, resp *Response) {
 | ||
| 	// 如果响应不为nil,则使用httpx.OkJsonCtx方法返回JSON响应;
 | ||
| 	if resp != nil {
 | ||
| 		httpx.OkJsonCtx(r.Context(), w, resp)
 | ||
| 	} else {
 | ||
| 		err := errors.New("server logic is error, resp must not be nil")
 | ||
| 		httpx.ErrorCtx(r.Context(), w, err)
 | ||
| 		logx.Error(err)
 | ||
| 	}
 | ||
| }
 | ||
| 
 | ||
| func RequestParse(w http.ResponseWriter, r *http.Request, svcCtx any, LogicRequest any) (*auth.UserInfo, error) {
 | ||
| 	// log.Println(io.ReadAll(r.Body))
 | ||
| 	token, info, err := auth.ParseJwtTokenHeader[auth.UserInfo](r) //解析Token头, 和payload信息
 | ||
| 	if err != nil {
 | ||
| 		logx.Error(err)
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	var secret uint64 = 0
 | ||
| 	if info != nil {
 | ||
| 
 | ||
| 		if info.IsUser() {
 | ||
| 			// us, err := state.GetUserState(info.UserId) //获取缓存的用户状态
 | ||
| 			reflect.ValueOf(svcCtx)
 | ||
| 
 | ||
| 			ctxValue := reflect.ValueOf(svcCtx).FieldByName("MysqlConn")
 | ||
| 			gdb := ctxValue.Interface().(*gorm.DB)
 | ||
| 
 | ||
| 			us, err := shared.GetUserState(info.UserId, gdb)
 | ||
| 			if err != nil {
 | ||
| 				logx.Error(err)
 | ||
| 				return nil, err
 | ||
| 			}
 | ||
| 			secret = us.PwdHash // 获取密码的hash做jwt, 便于重置密码的使用
 | ||
| 
 | ||
| 		} else if info.IsGuest() {
 | ||
| 			secret = DefaultJwtSecret //获取默认的hash
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	var userinfo *auth.UserInfo
 | ||
| 	if secret != 0 {
 | ||
| 		claims, err := auth.ParseJwtTokenUint64Secret(token, secret)
 | ||
| 		// 如果解析JWT token出错,则返回未授权的JSON响应并记录错误消息
 | ||
| 		if err != nil {
 | ||
| 			httpx.OkJsonCtx(r.Context(), w, &Response{
 | ||
| 				Code:    401,            // 返回401状态码,表示未授权
 | ||
| 				Message: "unauthorized", // 返回未授权信息
 | ||
| 			})
 | ||
| 			logx.Info("unauthorized:", err.Error()) // 记录错误日志
 | ||
| 			return nil, err
 | ||
| 		}
 | ||
| 
 | ||
| 		if claims != nil {
 | ||
| 			// 从token中获取对应的用户信息
 | ||
| 			userinfo, err = auth.GetUserInfoFormMapClaims(claims)
 | ||
| 			// 如果获取用户信息出错,则返回未授权的JSON响应并记录错误消息
 | ||
| 			if err != nil {
 | ||
| 				httpx.OkJsonCtx(r.Context(), w, &Response{
 | ||
| 					Code:    401,
 | ||
| 					Message: "unauthorized",
 | ||
| 				})
 | ||
| 				logx.Info("unauthorized:", err.Error())
 | ||
| 				return nil, err
 | ||
| 			}
 | ||
| 		}
 | ||
| 	} else {
 | ||
| 		// 白板用户
 | ||
| 		userinfo = &auth.UserInfo{UserId: 0, GuestId: 0}
 | ||
| 	}
 | ||
| 
 | ||
| 	// 如果端点有请求结构体,则使用httpx.Parse方法从HTTP请求体中解析请求数据
 | ||
| 	if err = httpx.Parse(r, LogicRequest); err != nil {
 | ||
| 		httpx.OkJsonCtx(r.Context(), w, &Response{
 | ||
| 			Code:    510,
 | ||
| 			Message: "parameter error",
 | ||
| 		})
 | ||
| 		logx.Error(err)
 | ||
| 		return nil, err
 | ||
| 	}
 | ||
| 
 | ||
| 	return userinfo, err
 | ||
| }
 | ||
| 
 | ||
| func RequestParseBackend(w http.ResponseWriter, r *http.Request, svcCtx IJWTParse, LogicRequest any) (userinfo *auth.BackendUserInfo, err error) {
 | ||
| 
 | ||
| 	// 解析JWT token,并对空用户进行判断
 | ||
| 	claims, err := svcCtx.ParseJwtToken(r)
 | ||
| 	// 如果解析JWT token出错,则返回未授权的JSON响应并记录错误消息
 | ||
| 	if err != nil {
 | ||
| 		httpx.OkJsonCtx(r.Context(), w, &Response{
 | ||
| 			Code:    401,            // 返回401状态码,表示未授权
 | ||
| 			Message: "unauthorized", // 返回未授权信息
 | ||
| 		})
 | ||
| 		logx.Info("unauthorized:", err.Error()) // 记录错误日志
 | ||
| 		return
 | ||
| 	}
 | ||
| 
 | ||
| 	if claims != nil {
 | ||
| 		// 从token中获取对应的用户信息
 | ||
| 		userinfo, err = auth.GetBackendUserInfoFormMapClaims(claims)
 | ||
| 		// 如果获取用户信息出错,则返回未授权的JSON响应并记录错误消息
 | ||
| 		if err != nil {
 | ||
| 			httpx.OkJsonCtx(r.Context(), w, &Response{
 | ||
| 				Code:    401,
 | ||
| 				Message: "unauthorized",
 | ||
| 			})
 | ||
| 			logx.Info("unauthorized:", err.Error())
 | ||
| 			return
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	// var req types.RequestGoogleLogin
 | ||
| 	// 如果端点有请求结构体,则使用httpx.Parse方法从HTTP请求体中解析请求数据
 | ||
| 	if err = httpx.Parse(r, LogicRequest); err != nil {
 | ||
| 		httpx.OkJsonCtx(r.Context(), w, &Response{
 | ||
| 			Code:    510,
 | ||
| 			Message: "parameter error",
 | ||
| 		})
 | ||
| 		logx.Info(err)
 | ||
| 		return
 | ||
| 	}
 | ||
| 
 | ||
| 	return userinfo, err
 | ||
| }
 |