You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OneAuth/api/init.go

115 lines
3.8 KiB
Go

12 months ago
//
// Copyright (C) 2024 veypi <i@veypi.com>
// 2025-03-04 16:08:06
// Distributed under terms of the MIT license.
//
package api
import (
1 month ago
apiAuth "github.com/veypi/vbase/api/auth"
"github.com/veypi/vbase/api/oauth"
"github.com/veypi/vbase/api/role"
"github.com/veypi/vbase/api/settings"
"github.com/veypi/vbase/api/user"
"github.com/veypi/vbase/api/verification"
1 month ago
"github.com/veypi/vbase/auth"
"github.com/veypi/vbase/cfg"
"github.com/veypi/vbase/models"
1 month ago
"github.com/veypi/vigo"
"github.com/veypi/vigo/contrib/common"
12 months ago
)
var Router = vigo.NewRouter()
12 months ago
// PublicInfoResponse 公开信息响应
// 不需要登录即可访问,用于前端初始化
type PublicInfoResponse struct {
AppName string `json:"app_name"`
AppID string `json:"app_id"`
OAuthProviders []OAuthProviderInfo `json:"oauth_providers"`
LoginMethods []string `json:"login_methods"`
PasswordFields []string `json:"password_fields"`
RegRequireEmail bool `json:"reg_require_email"`
RegRequirePhone bool `json:"reg_require_phone"`
CaptchaEnabled bool `json:"captcha_enabled"`
EmailEnabled bool `json:"email_enabled"`
SMSEnabled bool `json:"sms_enabled"`
}
// OAuthProviderInfo OAuth提供商公开信息
type OAuthProviderInfo struct {
Code string `json:"code"`
Name string `json:"name"`
Icon string `json:"icon"`
Enabled bool `json:"enabled"`
}
func init() {
// 注册全局中间件
Router.Use(auth.VBaseAuth.Login())
Router.After(common.JsonResponse, common.JsonErrorResponse)
// 初始化角色
auth.VBaseAuth.AddRole("admin", "管理员", "*:7")
auth.VBaseAuth.AddRole("user", "普通用户")
// 子路由挂载
1 month ago
Router.Extend("/auth", apiAuth.Router)
Router.Extend("/users", user.Router)
Router.Extend("/roles", role.Router)
Router.Extend("/oauth", oauth.Router)
Router.Extend("/settings", settings.Router)
Router.Extend("/verification", verification.Router)
// 公开信息接口(不需要登录)
Router.Get("/info", vigo.SkipBefore, "获取公开配置信息", getPublicInfo)
// 404 处理
Router.Any("/**", vigo.SkipBefore, "拦截未注册的api请求返回404", func(x *vigo.X) error {
return vigo.ErrNotFound
})
}
// getPublicInfo 获取公开配置信息
func getPublicInfo(x *vigo.X) (*PublicInfoResponse, error) {
resp := &PublicInfoResponse{}
// 应用配置
if name, err := models.GetSetting(models.SettingAppName); err == nil {
resp.AppName = name
}
if id, err := models.GetSetting(models.SettingAppID); err == nil {
resp.AppID = id
}
// 登录注册配置
if err := models.GetSettingJSON(models.SettingAuthLoginMethods, &resp.LoginMethods); err != nil || len(resp.LoginMethods) == 0 {
resp.LoginMethods = []string{"password"}
}
if err := models.GetSettingJSON(models.SettingAuthPasswordFields, &resp.PasswordFields); err != nil || len(resp.PasswordFields) == 0 {
resp.PasswordFields = []string{"username"}
}
resp.RegRequireEmail, _ = models.GetSettingBool(models.SettingAuthRegRequireEmail)
resp.RegRequirePhone, _ = models.GetSettingBool(models.SettingAuthRegRequirePhone)
resp.CaptchaEnabled, _ = models.GetSettingBool(models.SettingSecurityCaptchaEnabled)
resp.EmailEnabled, _ = models.GetSettingBool(models.SettingEmailEnabled)
resp.SMSEnabled, _ = models.GetSettingBool(models.SettingSMSEnabled)
// 获取启用的OAuth提供商
var providers []models.OAuthProvider
if err := cfg.DB().Where("enabled = ?", true).Order("sort_order").Find(&providers).Error; err == nil {
for _, p := range providers {
resp.OAuthProviders = append(resp.OAuthProviders, OAuthProviderInfo{
Code: p.Code,
Name: p.Name,
Icon: p.Icon,
Enabled: p.Enabled,
})
}
}
return resp, nil
}