package auth import ( "context" "git.noahlan.cn/n-admin/n-admin-server/api/internal/svc" "git.noahlan.cn/n-admin/n-admin-server/api/internal/types" "git.noahlan.cn/n-admin/n-admin-server/dal" "git.noahlan.cn/n-admin/n-admin-server/dal/errx" "git.noahlan.cn/n-admin/n-admin-server/rpc/core/types/core" "git.noahlan.cn/noahlan/ntool-biz/core/jwt" "git.noahlan.cn/noahlan/ntool-biz/core/nstatus" "git.noahlan.cn/noahlan/ntool/ndef" "git.noahlan.cn/noahlan/ntool/nlog" "net/http" "strings" ) // login 登录 func login(ctx context.Context, svcCtx *svc.ServiceContext, r *http.Request, user *core.UserInfo) (*types.LoginResp, error) { defer func() { if err := loginRecord(ctx, svcCtx, r, user.ID); err != nil { nlog.Errorw("记录登录次数失败", nlog.Field("err", err)) } }() rolesBuilder := new(strings.Builder) for i, v := range user.Roles { rolesBuilder.WriteString(v.Code) if i != len(user.Roles)-1 { rolesBuilder.WriteString(ndef.CommaStr) } } // TODO 检测账号,1是否开启两步验证(已配置) 2是否需要两步验证(异地登录之类) // 生成 token token, err := jwt.NewJwtToken( svcCtx.Config.Auth.AccessSecret, user.ID, svcCtx.Config.Auth.AccessExpire, jwt.WithRandID(), jwt.WithOption(jwt.KeyRoles, rolesBuilder.String()), ) if err != nil { return nil, nstatus.NewBizErrWithCode(errx.JwtTokenGenerateErr) } // TODO 落地Token return &types.LoginResp{ TwoFactorType: "", Token: types.LoginTokenInfo{ UID: user.ID, TokenType: "Bearer", AccessToken: token.AccessToken, ExpiresAt: token.ExpiresAt, Scope: "", }, }, nil } // loginRecord 记录登录 func loginRecord(ctx context.Context, svcCtx *svc.ServiceContext, r *http.Request, uid int64) error { // 记录登录次数 _, err := svcCtx.CoreRpc.Record(ctx, &core.LoginRecordInfo{ UserId: uid, LastLoginIpv4: r.RemoteAddr, LastLoginDevice: r.Header.Get(dal.UserDeviceKey), LastLoginUa: r.UserAgent(), }) if err != nil { return err } return nil } // register 注册用户 func register(ctx context.Context, svcCtx *svc.ServiceContext, user *core.UserInfo) (*core.UserInfo, error) { // 自动注册 rpcResp, err := svcCtx.CoreRpc.CreateUser(ctx, user) if err != nil { return nil, err } dbData, err := svcCtx.CoreRpc.GetUser(ctx, &core.UserReq{ ID: rpcResp.ID, }) if err != nil { return nil, err } return dbData, nil }