add sms enable option

v3
veypi 2 months ago
parent 95eccc2cde
commit 67b92662d1

@ -12,6 +12,7 @@ import (
"github.com/veypi/OneAuth/api/sms" "github.com/veypi/OneAuth/api/sms"
"github.com/veypi/OneAuth/api/token" "github.com/veypi/OneAuth/api/token"
"github.com/veypi/OneAuth/api/user" "github.com/veypi/OneAuth/api/user"
"github.com/veypi/OneAuth/cfg"
"github.com/veypi/OneAuth/libs/auth" "github.com/veypi/OneAuth/libs/auth"
"github.com/vyes-ai/vigo" "github.com/vyes-ai/vigo"
"github.com/vyes-ai/vigo/contrib/common" "github.com/vyes-ai/vigo/contrib/common"
@ -24,8 +25,15 @@ var (
_ = Router.Extend("token", token.Router) _ = Router.Extend("token", token.Router)
_ = Router.Extend("app", app.Router) _ = Router.Extend("app", app.Router)
_ = Router.Extend("sms", sms.Router) _ = Router.Extend("sms", sms.Router)
_ = Router.Get("cfg", vigo.SkipBefore, getCfg)
) )
var _ = Router.Any("*", vigo.SkipBefore, func(x *vigo.X) error { var _ = Router.Any("*", vigo.SkipBefore, func(x *vigo.X) error {
return vigo.ErrNotFound return vigo.ErrNotFound
}) })
func getCfg(x *vigo.X) any {
return map[string]any{
"sms": cfg.Config.SMS.Enable,
}
}

@ -10,11 +10,10 @@ package user
import ( import (
"encoding/base64" "encoding/base64"
"fmt" "fmt"
"math/rand"
"strings" "strings"
"time" "time"
"math/rand"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/veypi/OneAuth/api/sms" "github.com/veypi/OneAuth/api/sms"
"github.com/veypi/OneAuth/cfg" "github.com/veypi/OneAuth/cfg"
@ -47,12 +46,14 @@ func userPost(x *vigo.X) (any, error) {
data := &models.User{} data := &models.User{}
data.ID = strings.ReplaceAll(uuid.New().String(), "-", "") data.ID = strings.ReplaceAll(uuid.New().String(), "-", "")
if cfg.Config.SMS.Enable {
data.Phone = opts.Region + opts.Phone data.Phone = opts.Region + opts.Phone
data.Region = opts.Region data.Region = opts.Region
err = sms.VerifyCode(opts.Phone, opts.VerifyCode, opts.Region, "signup") err = sms.VerifyCode(opts.Phone, opts.VerifyCode, opts.Region, "signup")
if err != nil { if err != nil {
return nil, vigo.ErrArgInvalid.WithArgs("verify code").WithString(err.Error()) return nil, vigo.ErrArgInvalid.WithArgs("verify code").WithString(err.Error())
} }
}
data.Username = opts.Username data.Username = opts.Username
data.Code = opts.Code data.Code = opts.Code
data.Salt = utils.RandSeq(16) data.Salt = utils.RandSeq(16)

@ -4,15 +4,15 @@ import (
"time" "time"
) )
// Config 短信验证码配置 // SMSConfig 短信验证码配置
type SMSConfig struct { type SMSConfig struct {
// 区域配置 +86/.../global // 区域配置 +86/.../global
Regions map[string]RegionConfig `json:"regions"` Regions map[string]RegionConfig `json:"regions"`
Default RegionConfig `json:"default"` // 默认区域配置 Default RegionConfig `json:"default"` // 默认区域配置
// 全局配置 // 全局配置
Global GlobalConfig `json:"global"` Global GlobalConfig `json:"global"`
Enable bool `json:"enable"`
} }
// RegionConfig 区域配置 // RegionConfig 区域配置
@ -37,6 +37,7 @@ type GlobalConfig struct {
// DefaultConfig 默认配置 // DefaultConfig 默认配置
func defaultSMS() *SMSConfig { func defaultSMS() *SMSConfig {
return &SMSConfig{ return &SMSConfig{
Enable: true,
Global: GlobalConfig{ Global: GlobalConfig{
CodeLength: 6, CodeLength: 6,
CodeExpiry: 5 * time.Minute, CodeExpiry: 5 * time.Minute,

@ -16,9 +16,11 @@ import (
"github.com/vyes-ai/vigo/logv" "github.com/vyes-ai/vigo/logv"
) )
var cmdMain = flags.New("app", "the backend server of app") var (
var cmdCfg = cmdMain.SubCommand("cfg", "generate cfg file") cmdMain = flags.New("app", "the backend server of app")
var cmdDB = cmdMain.SubCommand("db", "database operations") cmdCfg = cmdMain.SubCommand("cfg", "generate cfg file")
cmdDB = cmdMain.SubCommand("db", "database operations")
)
var configFile = cmdMain.String("f", "./dev.yaml", "the config file") var configFile = cmdMain.String("f", "./dev.yaml", "the config file")
@ -36,7 +38,7 @@ func init() {
cmdMain.StringVar(&cliOpts.Host, "host", "0.0.0.0", "host") cmdMain.StringVar(&cliOpts.Host, "host", "0.0.0.0", "host")
cmdMain.IntVar(&cliOpts.Port, "p", 4000, "port") cmdMain.IntVar(&cliOpts.Port, "p", 4000, "port")
cmdMain.StringVar(&cliOpts.LoggerLevel, "l", "info", "log level") cmdMain.StringVar(&cliOpts.LoggerLevel, "l", "info", "log level")
cmdMain.AutoRegister(cliOpts) cmdMain.AutoRegister(cfg.Config)
cmdMain.Before = func() error { cmdMain.Before = func() error {
flags.LoadCfg(*configFile, cfg.Config) flags.LoadCfg(*configFile, cfg.Config)

@ -16,7 +16,7 @@ require (
github.com/golang-jwt/jwt/v5 v5.2.3 github.com/golang-jwt/jwt/v5 v5.2.3
github.com/google/uuid v1.6.0 github.com/google/uuid v1.6.0
github.com/veypi/vyes-ui v0.0.0-00010101000000-000000000000 github.com/veypi/vyes-ui v0.0.0-00010101000000-000000000000
github.com/vyes-ai/vigo v0.5.0 github.com/vyes-ai/vigo v0.5.2
golang.org/x/crypto v0.40.0 golang.org/x/crypto v0.40.0
gorm.io/driver/mysql v1.6.0 gorm.io/driver/mysql v1.6.0
gorm.io/driver/postgres v1.6.0 gorm.io/driver/postgres v1.6.0

@ -26,10 +26,12 @@ export default ($env) => {
} }
}; };
$env.$axios.interceptors.response.use(function(response) { $env.$axios.interceptors.response.use(function(response) {
console.log(response)
return response?.data || response; return response?.data || response;
}, function(error) { }, function(error) {
error = error?.response?.data || error?.response || error error = error?.response?.data || error?.response || error
return Promise.reject(error); return Promise.reject(error);
}); });
$env.$axios.get('/api/cfg').then(res => {
$env.$G.cfg = res
})
} }

@ -403,7 +403,7 @@
<input type="text" placeholder="用户名" v:value="signUpForm.username" class="input-group" required /> <input type="text" placeholder="用户名" v:value="signUpForm.username" class="input-group" required />
<!-- 手机号输入框带区域选择 --> <!-- 手机号输入框带区域选择 -->
<div class="phone-input-group"> <div v-if='$G.cfg.sms' class="phone-input-group">
<select class="region-select" v:value="signUpForm.region"> <select class="region-select" v:value="signUpForm.region">
<option v-for="region in regions" :value="region.code" :disabled='!region.enabled'> <option v-for="region in regions" :value="region.code" :disabled='!region.enabled'>
{{ region.code }} {{region.name}}</option> {{ region.code }} {{region.name}}</option>
@ -411,7 +411,7 @@
<input type="text" placeholder="手机号" v:value="signUpForm.phone" class="phone-input" required /> <input type="text" placeholder="手机号" v:value="signUpForm.phone" class="phone-input" required />
</div> </div>
<div class="input-group"> <div v-if='$G.cfg.sms' class="input-group">
<input type="text" placeholder="验证码" v:value="signUpForm.verifyCode" class="verify-code-input" required /> <input type="text" placeholder="验证码" v:value="signUpForm.verifyCode" class="verify-code-input" required />
<button type="button" class="verify-code-btn" @click="sendVerifyCode('signup')" <button type="button" class="verify-code-btn" @click="sendVerifyCode('signup')"
:disabled="smsCountdown > 0 || smsLoading"> :disabled="smsCountdown > 0 || smsLoading">
@ -683,11 +683,11 @@
signUpError = ''; signUpError = '';
// 验证用户名 // 验证用户名
if (signUpForm.username.length < 6) { if (signUpForm.username.length < 5) {
signUpError = '用户名必须大于5位。'; signUpError = '用户名必须大于5位。';
return; return;
} }
if ($G.cfg.sms) {
// 验证手机号 // 验证手机号
if (!validatePhone(signUpForm.phone, signUpForm.region)) { if (!validatePhone(signUpForm.phone, signUpForm.region)) {
signUpError = '请输入正确的手机号格式。'; signUpError = '请输入正确的手机号格式。';
@ -699,6 +699,8 @@
signUpError = '请输入验证码。'; signUpError = '请输入验证码。';
return; return;
} }
}
// 验证密码 // 验证密码
if (!validatePassword(signUpForm.password)) { if (!validatePassword(signUpForm.password)) {

@ -4,7 +4,7 @@
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>oa</title> <title>oa</title>
<script type="module" key='vyes' src="/vyes/v.js"></script> <script type="module" key='vyes' src="/assets/vyes.min.js"></script>
<link rel="stylesheet" href="/assets/common.css"> <link rel="stylesheet" href="/assets/common.css">
<link href="/assets/libs/tailwind/tailwind.min.css" rel="stylesheet"> <link href="/assets/libs/tailwind/tailwind.min.css" rel="stylesheet">
<link href="/assets/libs/animate/animate.min.css" rel="stylesheet"> <link href="/assets/libs/animate/animate.min.css" rel="stylesheet">

@ -7,6 +7,8 @@
class TokenService { class TokenService {
#url = '/' #url = '/'
#login_url = '/login'
#refresh_url = '/api/token'
constructor() { constructor() {
this.tokenKey = 'access'; this.tokenKey = 'access';
this.refreshTokenKey = 'refresh'; this.refreshTokenKey = 'refresh';

Loading…
Cancel
Save