|
|
//
|
|
|
// Copyright (C) 2024 veypi <i@veypi.com>
|
|
|
// 2025-03-04 16:08:06
|
|
|
// Distributed under terms of the MIT license.
|
|
|
//
|
|
|
|
|
|
package models
|
|
|
|
|
|
import (
|
|
|
"github.com/veypi/vigo"
|
|
|
)
|
|
|
|
|
|
// OAuthProvider 动态 OAuth 提供商配置
|
|
|
type OAuthProvider struct {
|
|
|
vigo.Model
|
|
|
Code string `gorm:"uniqueIndex;size:50;not null" json:"code"` // 唯一标识: google/github/feishu/...
|
|
|
Name string `gorm:"size:50" json:"name"` // 显示名称
|
|
|
Icon string `gorm:"size:100" json:"icon"` // 图标
|
|
|
Enabled bool `json:"enabled"` // 是否启用
|
|
|
SortOrder int `json:"sort_order" gorm:"default:0"` // 排序权重
|
|
|
|
|
|
// OAuth 配置
|
|
|
ClientID string `json:"client_id" gorm:"size:200"`
|
|
|
ClientSecret string `json:"client_secret" gorm:"size:200"` // 建议加密存储
|
|
|
AuthURL string `json:"auth_url" gorm:"size:500"`
|
|
|
TokenURL string `json:"token_url" gorm:"size:500"`
|
|
|
UserInfoURL string `json:"user_info_url" gorm:"size:500"`
|
|
|
Scopes []string `json:"scopes" gorm:"serializer:json"`
|
|
|
RedirectURI string `json:"redirect_uri" gorm:"size:500"` // 为空则使用默认 /auth/callback/{code}
|
|
|
|
|
|
// 用户信息字段映射(JSON Path)
|
|
|
UserIDPath string `json:"user_id_path" gorm:"size:100;default:'id'"`
|
|
|
UserNamePath string `json:"user_name_path" gorm:"size:100;default:'name'"`
|
|
|
UserEmailPath string `json:"user_email_path" gorm:"size:100;default:'email'"`
|
|
|
UserAvatarPath string `json:"user_avatar_path" gorm:"size:100"`
|
|
|
|
|
|
// 特殊平台配置
|
|
|
ExtraConfig map[string]string `json:"extra_config" gorm:"serializer:json"` // 如: {"appid_param": "appid"}
|
|
|
|
|
|
// 是否内置(内置的不可删除,只能禁用)
|
|
|
IsBuiltIn bool `json:"is_built_in" gorm:"default:false"`
|
|
|
}
|
|
|
|
|
|
// TableName 表名
|
|
|
func (OAuthProvider) TableName() string {
|
|
|
return "oauth_providers"
|
|
|
}
|
|
|
|
|
|
// OAuthProviderExtra 常用特殊配置键
|
|
|
const (
|
|
|
OAuthExtraAppIDParam = "appid_param" // 微信: appid 参数名不同
|
|
|
OAuthExtraUsePostToken = "use_post_token" // 是否 POST 获取 token
|
|
|
OAuthExtraTokenInBody = "token_in_body" // token 是否在 body 中返回
|
|
|
OAuthExtraStateParam = "state_param" // 自定义 state 参数名
|
|
|
)
|