128 lines
3.2 KiB
Go
128 lines
3.2 KiB
Go
package api
|
||
|
||
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)
|
||
}
|