This commit is contained in:
parent
c38e5bf27f
commit
8a5ad05b14
@ -24,7 +24,7 @@ export async function register(email: string, username: string, password: string
|
|||||||
"CaptchaToken": captchaToken
|
"CaptchaToken": captchaToken
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
return await apiGet(v)
|
return await apiGet<tokenData>(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function userInfo(token: string) {
|
export async function userInfo(token: string) {
|
||||||
|
@ -20,6 +20,8 @@ import CaptchaWidget from '@/components/CaptchaWidget';
|
|||||||
import type { refType as CaptchaWidgetRef } from '@/components/CaptchaWidget'
|
import type { refType as CaptchaWidgetRef } from '@/components/CaptchaWidget'
|
||||||
import useTitle from '@/hooks/useTitle';
|
import useTitle from '@/hooks/useTitle';
|
||||||
import { ApiErr } from '@/apis/error';
|
import { ApiErr } from '@/apis/error';
|
||||||
|
import { useSetAtom } from 'jotai';
|
||||||
|
import { token, user } from '@/store/store';
|
||||||
|
|
||||||
export default function SignUp() {
|
export default function SignUp() {
|
||||||
const [regErr, setRegErr] = useState("");
|
const [regErr, setRegErr] = useState("");
|
||||||
@ -28,6 +30,8 @@ export default function SignUp() {
|
|||||||
const captchaRef = useRef<CaptchaWidgetRef>(null)
|
const captchaRef = useRef<CaptchaWidgetRef>(null)
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
useTitle("注册")
|
useTitle("注册")
|
||||||
|
const setToken = useSetAtom(token)
|
||||||
|
const setUserInfo = useSetAtom(user)
|
||||||
|
|
||||||
|
|
||||||
const checkList = React.useRef<Map<string, refType>>(new Map<string, refType>())
|
const checkList = React.useRef<Map<string, refType>>(new Map<string, refType>())
|
||||||
@ -51,7 +55,15 @@ export default function SignUp() {
|
|||||||
}
|
}
|
||||||
setLoading(true)
|
setLoading(true)
|
||||||
register(d.email ?? "", d.username ?? "", d.password ?? "", captchaToken).
|
register(d.email ?? "", d.username ?? "", d.password ?? "", captchaToken).
|
||||||
then(() => navigate("/login")).
|
then(v => {
|
||||||
|
if (!v) return
|
||||||
|
setToken(v.token)
|
||||||
|
setUserInfo({
|
||||||
|
uuid: v.uuid,
|
||||||
|
name: v.name,
|
||||||
|
})
|
||||||
|
navigate("/profile")
|
||||||
|
}).
|
||||||
catch(v => {
|
catch(v => {
|
||||||
captchaRef.current?.reload()
|
captchaRef.current?.reload()
|
||||||
console.warn(v)
|
console.warn(v)
|
||||||
|
@ -33,13 +33,14 @@ func (h *Handel) Reg() http.HandlerFunc {
|
|||||||
h.handleError(ctx, w, err.Error(), model.ErrUnknown, 500, slog.LevelWarn)
|
h.handleError(ctx, w, err.Error(), model.ErrUnknown, 500, slog.LevelWarn)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = h.webService.Reg(ctx, u, rip, ip)
|
lr, err := h.webService.Reg(ctx, u, rip, ip)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
h.handleErrorService(ctx, w, err)
|
h.handleErrorService(ctx, w, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
encodeJson(w, model.API[any]{
|
encodeJson(w, model.API[model.LoginRep]{
|
||||||
Code: 0,
|
Code: 0,
|
||||||
|
Data: lr,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,25 +11,19 @@ import (
|
|||||||
|
|
||||||
func TestWebService_Auth(t *testing.T) {
|
func TestWebService_Auth(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
err := webService.Reg(ctx, model.UserReg{
|
lr, err := webService.Reg(ctx, model.UserReg{
|
||||||
Email: "TestWebService_Auth@xmdhs.com",
|
Email: "TestWebService_Auth@xmdhs.com",
|
||||||
Password: "TestWebService_Auth",
|
Password: "TestWebService_Auth",
|
||||||
Name: "TestWebService_Auth",
|
Name: "TestWebService_Auth",
|
||||||
CaptchaToken: "",
|
CaptchaToken: "",
|
||||||
}, "127.0.1.0/24", "127.0.1.0")
|
}, "127.0.1.0/24", "127.0.1.0")
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
require.Equal(t, lr.Name, "TestWebService_Auth")
|
||||||
|
|
||||||
l, err := webService.Login(ctx, model.Login{
|
token, err := webService.Auth(ctx, lr.Token)
|
||||||
Email: "TestWebService_Auth@xmdhs.com",
|
|
||||||
Password: "TestWebService_Auth",
|
|
||||||
CaptchaToken: "",
|
|
||||||
}, "0.0.0.0")
|
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
|
||||||
token, err := webService.Auth(ctx, l.Token)
|
assert.Equal(t, token.Subject, lr.UUID)
|
||||||
require.Nil(t, err)
|
|
||||||
|
|
||||||
assert.Equal(t, token.Subject, l.UUID)
|
|
||||||
assert.Equal(t, token.Tid, "1")
|
assert.Equal(t, token.Tid, "1")
|
||||||
|
|
||||||
type args struct {
|
type args struct {
|
||||||
|
@ -25,7 +25,7 @@ var (
|
|||||||
ErrChangeName = errors.New("离线模式 uuid 不允许修改用户名")
|
ErrChangeName = errors.New("离线模式 uuid 不允许修改用户名")
|
||||||
)
|
)
|
||||||
|
|
||||||
func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip string) error {
|
func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip string) (model.LoginRep, error) {
|
||||||
var userUuid string
|
var userUuid string
|
||||||
if w.config.OfflineUUID {
|
if w.config.OfflineUUID {
|
||||||
userUuid = utils.UUIDGen(u.Name)
|
userUuid = utils.UUIDGen(u.Name)
|
||||||
@ -35,21 +35,23 @@ func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip stri
|
|||||||
|
|
||||||
err := w.verifyCaptcha(ctx, u.CaptchaToken, ip)
|
err := w.verifyCaptcha(ctx, u.CaptchaToken, ip)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Reg: %w", err)
|
return model.LoginRep{}, fmt.Errorf("Reg: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if w.config.MaxIpUser != 0 {
|
if w.config.MaxIpUser != 0 {
|
||||||
c, err := w.client.User.Query().Where(user.RegIPEQ(ipPrefix)).Count(ctx)
|
c, err := w.client.User.Query().Where(user.RegIPEQ(ipPrefix)).Count(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Reg: %w", err)
|
return model.LoginRep{}, fmt.Errorf("Reg: %w", err)
|
||||||
}
|
}
|
||||||
if c >= w.config.MaxIpUser {
|
if c >= w.config.MaxIpUser {
|
||||||
return fmt.Errorf("Reg: %w", ErrRegLimit)
|
return model.LoginRep{}, fmt.Errorf("Reg: %w", ErrRegLimit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
p, s := utils.Argon2ID(u.Password)
|
p, s := utils.Argon2ID(u.Password)
|
||||||
|
|
||||||
|
var du *ent.User
|
||||||
|
|
||||||
err = utils.WithTx(ctx, w.client, func(tx *ent.Tx) error {
|
err = utils.WithTx(ctx, w.client, func(tx *ent.Tx) error {
|
||||||
count, err := tx.User.Query().Where(user.EmailEQ(u.Email)).ForUpdateA().Count(ctx)
|
count, err := tx.User.Query().Where(user.EmailEQ(u.Email)).ForUpdateA().Count(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -65,7 +67,7 @@ func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip stri
|
|||||||
if nameCount != 0 {
|
if nameCount != 0 {
|
||||||
return ErrExitsName
|
return ErrExitsName
|
||||||
}
|
}
|
||||||
du, err := tx.User.Create().
|
du, err = tx.User.Create().
|
||||||
SetEmail(u.Email).
|
SetEmail(u.Email).
|
||||||
SetPassword(p).
|
SetPassword(p).
|
||||||
SetSalt(s).
|
SetSalt(s).
|
||||||
@ -92,9 +94,18 @@ func (w *WebService) Reg(ctx context.Context, u model.UserReg, ipPrefix, ip stri
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Reg: %w", err)
|
return model.LoginRep{}, fmt.Errorf("Reg: %w", err)
|
||||||
}
|
}
|
||||||
return nil
|
jwt, err := utilsService.CreateToken(ctx, du, w.client, w.cache, w.prikey, "web")
|
||||||
|
if err != nil {
|
||||||
|
return model.LoginRep{}, fmt.Errorf("Login: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return model.LoginRep{
|
||||||
|
Token: jwt,
|
||||||
|
Name: u.Name,
|
||||||
|
UUID: userUuid,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *WebService) Login(ctx context.Context, l model.Login, ip string) (model.LoginRep, error) {
|
func (w *WebService) Login(ctx context.Context, l model.Login, ip string) (model.LoginRep, error) {
|
||||||
|
@ -143,7 +143,7 @@ func TestWebService_Reg(t *testing.T) {
|
|||||||
}
|
}
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
if err := tt.w.Reg(tt.args.ctx, tt.args.u, tt.args.ipPrefix, tt.args.ip); (err != nil) != tt.wantErr {
|
if _, err := tt.w.Reg(tt.args.ctx, tt.args.u, tt.args.ipPrefix, tt.args.ip); (err != nil) != tt.wantErr {
|
||||||
t.Errorf("WebService.Reg() error = %v, wantErr %v", err, tt.wantErr)
|
t.Errorf("WebService.Reg() error = %v, wantErr %v", err, tt.wantErr)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user