@@ -3,24 +3,22 @@ package handler
33import (
44 "net/http"
55
6- "github.com/dushixiang/uart_sms_forwarder/config"
7- "github.com/dushixiang/uart_sms_forwarder/internal/util"
6+ "github.com/dushixiang/uart_sms_forwarder/internal/service"
87 "github.com/labstack/echo/v4"
98 "go.uber.org/zap"
10- "golang.org/x/crypto/bcrypt"
119)
1210
1311// AuthHandler 认证处理器
1412type AuthHandler struct {
15- logger * zap.Logger
16- config * config. AppConfig
13+ logger * zap.Logger
14+ accountService * service. AccountService
1715}
1816
1917// NewAuthHandler 创建认证处理器
20- func NewAuthHandler (logger * zap.Logger , config * config. AppConfig ) * AuthHandler {
18+ func NewAuthHandler (logger * zap.Logger , accountService * service. AccountService ) * AuthHandler {
2119 return & AuthHandler {
22- logger : logger ,
23- config : config ,
20+ logger : logger ,
21+ accountService : accountService ,
2422 }
2523}
2624
@@ -42,7 +40,6 @@ func (h *AuthHandler) Login(c echo.Context) error {
4240 // 获取请求参数
4341 var req LoginRequest
4442 if err := c .Bind (& req ); err != nil {
45- h .logger .Warn ("登录请求参数解析失败" , zap .Error (err ))
4643 return c .JSON (http .StatusBadRequest , map [string ]string {
4744 "error" : "请求参数错误" ,
4845 })
@@ -55,49 +52,75 @@ func (h *AuthHandler) Login(c echo.Context) error {
5552 })
5653 }
5754
58- // 从配置中获取用户密码哈希
59- passwordHash , exists := h . config . Users [ req . Username ]
60- if ! exists {
61- h . logger . Warn ( "用户不存在" , zap . String ( "username" , req . Username ))
55+ // 使用 AccountService 进行登录
56+ ctx := c . Request (). Context ()
57+ loginResp , err := h . accountService . Login ( ctx , req . Username , req . Password )
58+ if err != nil {
6259 return c .JSON (http .StatusBadRequest , map [string ]string {
6360 "error" : "用户名或密码错误" ,
6461 })
6562 }
6663
67- // 验证密码
68- err := bcrypt .CompareHashAndPassword ([]byte (passwordHash ), []byte (req .Password ))
64+ // 返回 token 和用户信息
65+ return c .JSON (http .StatusOK , LoginResponse {
66+ Token : loginResp .Token ,
67+ Username : loginResp .User .Username ,
68+ ExpiresAt : loginResp .ExpiresAt ,
69+ })
70+ }
71+
72+ // GetAuthConfig 获取认证配置
73+ func (h * AuthHandler ) GetAuthConfig (c echo.Context ) error {
74+ config := h .accountService .GetAuthConfig ()
75+ return c .JSON (http .StatusOK , config )
76+ }
77+
78+ // GetOIDCAuthURL 获取 OIDC 认证 URL
79+ func (h * AuthHandler ) GetOIDCAuthURL (c echo.Context ) error {
80+ authURL , err := h .accountService .GetOIDCAuthURL ()
6981 if err != nil {
70- h .logger .Warn ("密码验证失败" ,
71- zap .String ("username" , req .Username ),
72- zap .Error (err ),
73- )
7482 return c .JSON (http .StatusBadRequest , map [string ]string {
75- "error" : "用户名或密码错误" ,
83+ "error" : err . Error () ,
7684 })
7785 }
86+ return c .JSON (http .StatusOK , authURL )
87+ }
7888
79- // 生成 JWT token
80- token , expiresAt , err := util .GenerateToken (
81- req .Username ,
82- h .config .JWT .Secret ,
83- h .config .JWT .ExpiresHours ,
84- )
85- if err != nil {
86- h .logger .Error ("生成 token 失败" ,
87- zap .String ("username" , req .Username ),
88- zap .Error (err ),
89- )
90- return c .JSON (http .StatusInternalServerError , map [string ]string {
91- "error" : "登录失败,请稍后重试" ,
89+ // OIDCCallbackRequest OIDC 回调请求
90+ type OIDCCallbackRequest struct {
91+ Code string `json:"code" validate:"required"`
92+ State string `json:"state" validate:"required"`
93+ }
94+
95+ // OIDCCallback 处理 OIDC 回调
96+ func (h * AuthHandler ) OIDCCallback (c echo.Context ) error {
97+ var req OIDCCallbackRequest
98+ if err := c .Bind (& req ); err != nil {
99+ return c .JSON (http .StatusBadRequest , map [string ]string {
100+ "error" : "请求参数错误" ,
92101 })
93102 }
94103
95- h .logger .Info ("用户登录成功" , zap .String ("username" , req .Username ))
104+ if req .Code == "" || req .State == "" {
105+ return c .JSON (http .StatusBadRequest , map [string ]string {
106+ "error" : "缺少必要参数" ,
107+ })
108+ }
109+
110+ // 使用 AccountService 处理 OIDC 登录
111+ ctx := c .Request ().Context ()
112+ loginResp , err := h .accountService .LoginWithOIDC (ctx , req .Code , req .State )
113+ if err != nil {
114+ h .logger .Error ("OIDC 登录失败" , zap .Error (err ))
115+ return c .JSON (http .StatusUnauthorized , map [string ]string {
116+ "error" : "OIDC 认证失败" ,
117+ })
118+ }
96119
97120 // 返回 token 和用户信息
98121 return c .JSON (http .StatusOK , LoginResponse {
99- Token : token ,
100- Username : req .Username ,
101- ExpiresAt : expiresAt ,
122+ Token : loginResp . Token ,
123+ Username : loginResp . User .Username ,
124+ ExpiresAt : loginResp . ExpiresAt ,
102125 })
103126}
0 commit comments