2025-05-31 16:14:34 +08:00
|
|
|
|
package api
|
2025-05-31 17:20:28 +08:00
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/url"
|
|
|
|
|
|
|
|
|
|
"122.51.31.227/go-course/go18/devcloud/mcenter/apps/token"
|
|
|
|
|
"github.com/emicklei/go-restful/v3"
|
|
|
|
|
"github.com/infraboard/mcube/v2/http/restful/response"
|
|
|
|
|
"github.com/infraboard/mcube/v2/ioc/config/application"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func (h *TokenRestulApiHandler) Login(r *restful.Request, w *restful.Response) {
|
|
|
|
|
// 1. 获取用户的请求参数, 参数在Body里面
|
|
|
|
|
req := token.NewIssueTokenRequest()
|
|
|
|
|
|
|
|
|
|
// 获取用户通过body传入的参数
|
|
|
|
|
err := r.ReadEntity(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
response.Failed(w, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 设置当前调用者的Token
|
|
|
|
|
// Private 用户自己的Token
|
|
|
|
|
// 如果你是user/password 这种方式,token 直接放到body
|
|
|
|
|
switch req.Issuer {
|
|
|
|
|
case token.ISSUER_PRIVATE_TOKEN:
|
|
|
|
|
req.Parameter.SetAccessToken(token.GetAccessTokenFromHTTP(r.Request))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. 执行逻辑
|
|
|
|
|
tk, err := h.svc.IssueToken(r.Request.Context(), req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
response.Failed(w, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// access_token 通过SetCookie 直接写到浏览器客户端(Web)
|
|
|
|
|
http.SetCookie(w, &http.Cookie{
|
|
|
|
|
Name: token.ACCESS_TOKEN_COOKIE_NAME,
|
|
|
|
|
Value: url.QueryEscape(tk.AccessToken),
|
|
|
|
|
MaxAge: 0,
|
|
|
|
|
Path: "/",
|
|
|
|
|
Domain: application.Get().Domain(),
|
|
|
|
|
SameSite: http.SameSiteDefaultMode,
|
|
|
|
|
Secure: false,
|
|
|
|
|
HttpOnly: true,
|
|
|
|
|
})
|
|
|
|
|
// 在Header头中也添加Token
|
|
|
|
|
w.Header().Set(token.ACCESS_TOKEN_RESPONSE_HEADER_NAME, tk.AccessToken)
|
|
|
|
|
|
|
|
|
|
// 3. Body中返回Token对象
|
|
|
|
|
response.Success(w, tk)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// func (h *TokenRestulApiHandler) ChangeNamespce(r *restful.Request, w *restful.Response) {
|
|
|
|
|
// // 1. 获取用户的请求参数, 参数在Body里面
|
|
|
|
|
// req := token.NewChangeNamespceRequest()
|
|
|
|
|
// err := r.ReadEntity(req)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// response.Failed(w, err)
|
|
|
|
|
// return
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// tk := token.GetTokenFromCtx(r.Request.Context())
|
|
|
|
|
// req.UserId = tk.UserId
|
|
|
|
|
|
|
|
|
|
// // 2. 执行逻辑
|
|
|
|
|
// tk, err = h.svc.ChangeNamespce(r.Request.Context(), req)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// response.Failed(w, err)
|
|
|
|
|
// return
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// // 3. Body中返回Token对象
|
|
|
|
|
// response.Success(w, tk)
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// Logout HandleFunc
|
|
|
|
|
func (h *TokenRestulApiHandler) Logout(r *restful.Request, w *restful.Response) {
|
|
|
|
|
req := token.NewRevolkTokenRequest(
|
|
|
|
|
token.GetAccessTokenFromHTTP(r.Request),
|
|
|
|
|
token.GetRefreshTokenFromHTTP(r.Request),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
tk, err := h.svc.RevolkToken(r.Request.Context(), req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
response.Failed(w, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// access_token 通过SetCookie 直接写到浏览器客户端(Web)
|
|
|
|
|
http.SetCookie(w, &http.Cookie{
|
|
|
|
|
Name: token.ACCESS_TOKEN_COOKIE_NAME,
|
|
|
|
|
Value: "",
|
|
|
|
|
MaxAge: 0,
|
|
|
|
|
Path: "/",
|
|
|
|
|
Domain: application.Get().Domain(),
|
|
|
|
|
SameSite: http.SameSiteDefaultMode,
|
|
|
|
|
Secure: false,
|
|
|
|
|
HttpOnly: true,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 3. 返回响应
|
|
|
|
|
response.Success(w, tk)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (h *TokenRestulApiHandler) ValiateToken(r *restful.Request, w *restful.Response) {
|
|
|
|
|
// 1. 获取用户的请求参数, 参数在Body里面
|
|
|
|
|
req := token.NewValiateTokenRequest("")
|
|
|
|
|
err := r.ReadEntity(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
response.Failed(w, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. 执行逻辑
|
|
|
|
|
tk, err := h.svc.ValiateToken(r.Request.Context(), req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
response.Failed(w, err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 3. Body中返回Token对象
|
|
|
|
|
response.Success(w, tk)
|
|
|
|
|
}
|