|
|
@@ -6,9 +6,9 @@ import (
|
|
|
"github.com/golang-jwt/jwt"
|
|
|
"github.com/mojocn/base64Captcha"
|
|
|
"github.com/satori/go.uuid"
|
|
|
+ "iot_manager_service/app/middleware"
|
|
|
"iot_manager_service/app/system/dao"
|
|
|
"iot_manager_service/app/system/service"
|
|
|
- "strconv"
|
|
|
"time"
|
|
|
|
|
|
"iot_manager_service/app/system/model"
|
|
|
@@ -50,11 +50,22 @@ func (c *auth) Token(ctx *gin.Context) {
|
|
|
RefreshToken: refreshToken,
|
|
|
UserType: userType,
|
|
|
}
|
|
|
- userInfo, err := grant(token, ctx)
|
|
|
- if err != nil {
|
|
|
- ctx.JSON(http.StatusOK, err)
|
|
|
- return
|
|
|
+ var userInfo *model.UserInfo
|
|
|
+ var err *util.Errors
|
|
|
+ if grantType == "captcha" {
|
|
|
+ userInfo, err = captchaGrant(token, ctx)
|
|
|
+ if err != nil {
|
|
|
+ ctx.JSON(http.StatusOK, err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ } else if grantType == "refresh_token" {
|
|
|
+ userInfo, err = refreshGrant(token)
|
|
|
+ if err != nil {
|
|
|
+ ctx.JSON(http.StatusOK, err)
|
|
|
+ return
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
if userInfo == nil || userInfo.User == nil {
|
|
|
ctx.JSON(http.StatusOK, util.NormalResponse(http.StatusBadRequest, model.UserNotFound, nil))
|
|
|
return
|
|
|
@@ -66,7 +77,7 @@ func (c *auth) Token(ctx *gin.Context) {
|
|
|
|
|
|
// access token过期时间2小时
|
|
|
random := util.RandomString(8)
|
|
|
- jwtToken, e := getAccessToken(*userInfo, random)
|
|
|
+ jwtToken, e := middleware.GetAccessToken(userInfo.ID, userInfo.RoleId, userInfo.TenantId, userInfo.Account, random)
|
|
|
if e != nil {
|
|
|
ctx.JSON(http.StatusOK, util.NormalResponse(http.StatusBadRequest, e.Error(), nil))
|
|
|
return
|
|
|
@@ -76,9 +87,7 @@ func (c *auth) Token(ctx *gin.Context) {
|
|
|
util.Redis.Set(getAccessTokenKey(userInfo.TenantId, userInfo.ID, random), jwtToken, 2*time.Hour)
|
|
|
ctx.JSON(http.StatusOK, model.RspToken{
|
|
|
TenantId: userInfo.TenantId,
|
|
|
- UserId: strconv.FormatInt(userInfo.ID, 10),
|
|
|
- DeptId: userInfo.DeptId,
|
|
|
- PostId: userInfo.PostId,
|
|
|
+ UserId: userInfo.ID,
|
|
|
RoleId: userInfo.RoleId,
|
|
|
OauthId: userInfo.OauthId,
|
|
|
Account: userInfo.Account,
|
|
|
@@ -95,15 +104,13 @@ func (c *auth) Token(ctx *gin.Context) {
|
|
|
}
|
|
|
|
|
|
func (c *auth) Logout(ctx *gin.Context) {
|
|
|
- emptyKeyFunc := func(t *jwt.Token) (interface{}, error) { return []byte(config.Instance().Server.TokenSign), nil }
|
|
|
- authorization := ctx.GetHeader(model.HeaderKey)
|
|
|
- token, err := jwt.ParseWithClaims(authorization, &model.JwtToken{}, emptyKeyFunc)
|
|
|
- if err != nil {
|
|
|
- ctx.JSON(http.StatusUnauthorized, util.NormalResponse(http.StatusUnauthorized, err.Error(), nil))
|
|
|
+ value, isExist := ctx.Get(middleware.Authorization)
|
|
|
+ if !isExist || value == nil {
|
|
|
+ ctx.JSON(http.StatusUnauthorized, util.NormalResponse(http.StatusUnauthorized, "", nil))
|
|
|
return
|
|
|
}
|
|
|
- jwtToken := token.Claims.(*model.JwtToken)
|
|
|
- err = util.Redis.Del(getAccessTokenKey(jwtToken.TenantId, jwtToken.UserId, jwtToken.Random)).Err()
|
|
|
+ jwtToken := value.(*middleware.JwtToken)
|
|
|
+ _ = util.Redis.Del(getAccessTokenKey(jwtToken.TenantId, jwtToken.UserId, jwtToken.Random)).Err()
|
|
|
//todo 操作记录
|
|
|
ctx.JSON(http.StatusOK, util.SuccessResponse("", nil))
|
|
|
}
|
|
|
@@ -147,32 +154,6 @@ func checkLock() {
|
|
|
|
|
|
}
|
|
|
|
|
|
-func getAccessToken(info model.UserInfo, random string) (string, error) {
|
|
|
- jwtToken := model.JwtToken{StandardClaims: jwt.StandardClaims{
|
|
|
- Audience: model.Audience,
|
|
|
- Issuer: model.Issuer,
|
|
|
- ExpiresAt: time.Now().Add(2 * time.Hour).Unix(),
|
|
|
- NotBefore: time.Now().Unix(),
|
|
|
- },
|
|
|
- UserId: info.ID,
|
|
|
- TenantId: info.TenantId,
|
|
|
- TokenType: model.AccessToken,
|
|
|
- ClientId: model.Saber,
|
|
|
- RoleId: info.RoleId,
|
|
|
- RoleName: info.Roles[0],
|
|
|
- DeptId: info.DeptId,
|
|
|
- PostId: info.PostId,
|
|
|
- OauthId: info.OauthId,
|
|
|
- Account: info.Account,
|
|
|
- UserName: info.Account,
|
|
|
- NickName: info.RealName,
|
|
|
- Random: random,
|
|
|
- }
|
|
|
-
|
|
|
- claims := jwt.NewWithClaims(jwt.SigningMethodHS512, jwtToken)
|
|
|
- return claims.SignedString([]byte(config.Instance().Server.TokenSign))
|
|
|
-}
|
|
|
-
|
|
|
func getRefreshToken(info model.UserInfo) string {
|
|
|
claims := jwt.NewWithClaims(jwt.SigningMethodHS512, jwt.MapClaims{
|
|
|
model.Iss: model.Issuer,
|
|
|
@@ -187,7 +168,15 @@ func getRefreshToken(info model.UserInfo) string {
|
|
|
return token
|
|
|
}
|
|
|
|
|
|
-func grant(token model.Token, ctx *gin.Context) (*model.UserInfo, *util.Errors) {
|
|
|
+func parseRefreshToken(refreshToken string) *jwt.MapClaims {
|
|
|
+ token, err := jwt.ParseWithClaims(refreshToken, &jwt.MapClaims{}, middleware.EmptyKeyFunc)
|
|
|
+ if err != nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ return token.Claims.(*jwt.MapClaims)
|
|
|
+}
|
|
|
+
|
|
|
+func captchaGrant(token model.Token, ctx *gin.Context) (*model.UserInfo, *util.Errors) {
|
|
|
info := &model.UserInfo{}
|
|
|
key := ctx.GetHeader(model.CaptchaHeaderKey)
|
|
|
code := ctx.GetHeader(model.CaptchaHeaderCode)
|
|
|
@@ -214,13 +203,33 @@ func grant(token model.Token, ctx *gin.Context) (*model.UserInfo, *util.Errors)
|
|
|
// 获取用户类型
|
|
|
// 根据不同用户类型调用对应的接口返回数据,用户可自行拓展
|
|
|
info.User = service.UserService.GetOne(token.TenantId, token.UserName, token.Password)
|
|
|
+ info.TenantId = token.TenantId
|
|
|
+ info.Roles = []string{"admin"}
|
|
|
}
|
|
|
|
|
|
- //测试代码start
|
|
|
- info.TenantId = "000000"
|
|
|
- info.ID = 11112222
|
|
|
+ //todo 操作记录
|
|
|
+ return info, nil
|
|
|
+}
|
|
|
+
|
|
|
+func refreshGrant(token model.Token) (*model.UserInfo, *util.Errors) {
|
|
|
+ info := &model.UserInfo{}
|
|
|
+ jwtToken := parseRefreshToken(token.RefreshToken)
|
|
|
+ if jwtToken == nil || len(*jwtToken) != 7 {
|
|
|
+ return nil, util.NormalResponse(http.StatusOK, model.UserHasNoTenantPermission, nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取租户信息
|
|
|
+ tenant, _ := service.TenantService.GetOne(token.TenantId)
|
|
|
+ if tenant == nil {
|
|
|
+ return nil, util.NormalResponse(http.StatusOK, model.UserHasNoTenant, nil)
|
|
|
+ }
|
|
|
+ if judgeTenant(tenant) {
|
|
|
+ return nil, util.NormalResponse(http.StatusOK, model.UserHasNoTenantPermission, nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ info.User = service.UserService.GetOneByTenantId(token.TenantId)
|
|
|
info.Roles = []string{"admin"}
|
|
|
- // 测试代码end
|
|
|
+
|
|
|
//todo 操作记录
|
|
|
return info, nil
|
|
|
}
|
|
|
@@ -229,10 +238,10 @@ func judgeTenant(tenant *dao.Tenant) bool {
|
|
|
if tenant.TenantId == model.AdminTenantId {
|
|
|
return false
|
|
|
}
|
|
|
- if tenant.ExpireTime.IsZero() || tenant.ExpireTime.Before(time.Now()) {
|
|
|
- return true
|
|
|
+ if tenant.ExpireTime.IsZero() || !tenant.ExpireTime.Before(time.Now()) {
|
|
|
+ return false
|
|
|
}
|
|
|
- return false
|
|
|
+ return true
|
|
|
}
|
|
|
|
|
|
func getAccessTokenKey(tenantId string, uId int64, random string) string {
|