Files
goalfylearning-admin/internal/models/sso.go

197 lines
6.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package models
import (
"time"
)
// SSOConfig SSO配置结构体
type SSOConfig struct {
// SSO服务器地址
SSOServerURL string `json:"sso_server_url"`
// OAuth客户端ID
ClientID string `json:"client_id"`
// OAuth客户端密钥
ClientSecret string `json:"client_secret"`
// 重定向URI
RedirectURI string `json:"redirect_uri"`
// 请求作用域
Scope string `json:"scope"`
// 资源受众
ResourceAud string `json:"resource_aud"`
// HTTP超时时间
Timeout time.Duration `json:"timeout"`
}
// TokenResponse OAuth令牌响应
type TokenResponse struct {
AccessToken string `json:"access_token"`
IDToken string `json:"id_token"`
RefreshToken string `json:"refresh_token"`
TokenType string `json:"token_type"`
ExpiresIn int `json:"expires_in"`
}
// SSOUserInfo SSO API 返回的用户信息(用于解析 SSO 响应)
type SSOUserInfo struct {
Sub string `json:"sub"`
Name string `json:"name,omitempty"`
Email string `json:"email,omitempty"`
PreferredUsername string `json:"preferred_username,omitempty"`
Roles interface{} `json:"roles,omitempty"` // 使用 interface{} 来接受任何类型
}
// UserInfo 用户信息(用于应用程序内部)
type UserInfo struct {
Sub string `json:"sub"`
Name string `json:"name,omitempty"`
Email string `json:"email,omitempty"`
PreferredUsername string `json:"preferred_username,omitempty"`
Pages []Page `json:"pages,omitempty"`
Roles []Role `json:"roles,omitempty"`
}
// OpenIDConfiguration OpenID配置
type OpenIDConfiguration struct {
Issuer string `json:"issuer"`
AuthorizationEndpoint string `json:"authorization_endpoint"`
TokenEndpoint string `json:"token_endpoint"`
UserinfoEndpoint string `json:"userinfo_endpoint"`
JwksURI string `json:"jwks_uri"`
ResponseTypesSupported []string `json:"response_types_supported"`
SubjectTypesSupported []string `json:"subject_types_supported"`
IDTokenSigningAlgValuesSupported []string `json:"id_token_signing_alg_values_supported"`
CodeChallengeMethodsSupported []string `json:"code_challenge_methods_supported"`
TokenEndpointAuthMethodsSupported []string `json:"token_endpoint_auth_methods_supported"`
}
// JWKS JSON Web Key Set
type JWKS struct {
Keys []map[string]interface{} `json:"keys"`
}
// AuthCodeRequest 授权码请求参数
type AuthCodeRequest struct {
ClientID string `json:"client_id"`
RedirectURI string `json:"redirect_uri"`
ResponseType string `json:"response_type"`
Scope string `json:"scope"`
State string `json:"state"`
CodeChallenge string `json:"code_challenge"`
CodeChallengeMethod string `json:"code_challenge_method"`
Prompt string `json:"prompt"`
}
// TokenRequest 令牌请求参数
type TokenRequest struct {
GrantType string `json:"grant_type"`
Code string `json:"code"`
RedirectURI string `json:"redirect_uri"`
CodeVerifier string `json:"code_verifier"`
RefreshToken string `json:"refresh_token"`
}
// Session 用户会话信息
type Session struct {
UserID string `json:"user_id"`
UserInfo *UserInfo `json:"user_info"`
TokenInfo *TokenResponse `json:"token_info"`
ExpiresAt time.Time `json:"expires_at"`
}
// SSOLoginRequest SSO登录请求
type SSOLoginRequest struct {
// 可以为空用于初始化SSO登录流程
}
// SSOLoginResponse SSO登录响应
type SSOLoginResponse struct {
Success bool `json:"success"`
Message string `json:"message"`
AuthURL string `json:"auth_url"`
State string `json:"state"`
CodeVerifier string `json:"code_verifier"`
}
// SSOCallbackRequest SSO回调请求
type SSOCallbackRequest struct {
Code string `json:"code" binding:"required"`
State string `json:"state" binding:"required"`
}
// SSOCallbackResponse SSO回调响应
type SSOCallbackResponse struct {
Success bool `json:"success"`
Message string `json:"message"`
AccessToken string `json:"access_token,omitempty"`
IDToken string `json:"id_token,omitempty"`
RefreshToken string `json:"refresh_token,omitempty"`
ExpiresIn int `json:"expires_in,omitempty"`
UserInfo *UserInfo `json:"user_info,omitempty"`
UUID string `json:"uuid,omitempty"`
}
// RefreshTokenRequest 刷新令牌请求
type RefreshTokenRequest struct {
RefreshToken string `json:"refresh_token" binding:"required"`
}
// RefreshTokenResponse 刷新令牌响应
type RefreshTokenResponse struct {
Success bool `json:"success"`
Message string `json:"message"`
AccessToken string `json:"access_token,omitempty"`
IDToken string `json:"id_token,omitempty"`
RefreshToken string `json:"refresh_token,omitempty"`
ExpiresIn int `json:"expires_in,omitempty"`
}
// LogoutRequest 登出请求
type LogoutRequest struct {
// AccessToken字段保留用于向后兼容但实际不再使用
AccessToken string `json:"access_token,omitempty"`
}
// LogoutResponse 登出响应
type LogoutResponse struct {
Success bool `json:"success"`
Message string `json:"message"`
}
// UserInfoResponse 用户信息响应
type UserInfoResponse struct {
Success bool `json:"success"`
Message string `json:"message"`
UserInfo *UserInfo `json:"user_info,omitempty"`
}
// PKCEState PKCE状态信息
type PKCEState struct {
BaseModel
State string `gorm:"size:191;uniqueIndex;column:state" json:"state"`
CodeVerifier string `gorm:"column:code_verifier" json:"code_verifier"`
}
func (p *PKCEState) TableName() string {
return "admin_pkce_states"
}
// LoginInfo 用户登录信息
type LoginInfo struct {
BaseModel
UserID int `gorm:"column:user_id;not null" json:"user_id"`
UserName string `gorm:"column:user_name;size:100;not null" json:"user_name"`
Email string `gorm:"column:email;size:255;not null" json:"email"`
UUID string `gorm:"column:uuid;size:100;not null" json:"uuid"`
IsOnline bool `gorm:"column:is_online;default:false" json:"is_online"`
}
func (l *LoginInfo) TableName() string {
return "admin_login_infos"
}
// ErrorResponse 错误响应
type ErrorResponse struct {
Error string `json:"error"`
Message string `json:"message"`
}