123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package middleware
- import (
- "DataShare/global"
- "DataShare/model"
- "errors"
- "fmt"
- "github.com/dgrijalva/jwt-go"
- "github.com/twinj/uuid"
- "net/http"
- "time"
- )
- func CreateToken(appid string,appSecret string) (*model.TokenDetails, error) {
- td := &model.TokenDetails{}
- tokenExpire := global.SystemConfig.Redis.Cache.TokenExpire
- td.AtExpires = time.Now().Add(time.Second * time.Duration(tokenExpire)).Unix() //expires after 30 min
- td.TokenUuid = "uuid_"+uuid.NewV4().String()
- //td.RtExpires = time.Now().Add(time.Hour * 24 * 7).Unix()
- //td.RefreshUuid = td.TokenUuid + "++" + userId
- var err error
- //Creating Access Token
- atClaims := jwt.MapClaims{}
- atClaims["access_uuid"] = td.TokenUuid
- atClaims["appId"] = appid //账号
- atClaims["appSecret"] = appSecret //账号
- atClaims["exp"] = td.AtExpires
- at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
- td.AccessToken, err = at.SignedString([]byte(global.SystemConfig.Jwt.Signkey))
- if err != nil {
- return nil, err
- }
- //Creating Refresh Token
- refrushTokenExpire := global.SystemConfig.Redis.Cache.RefrushTokenExpire
- td.RtExpires = time.Now().Add(time.Second * time.Duration(refrushTokenExpire)).Unix()
- td.RefreshUuid = "uuid_"+td.TokenUuid + "++" + appid
- rtClaims := jwt.MapClaims{}
- rtClaims["refresh_uuid"] = td.RefreshUuid
- rtClaims["appId"] = appid //账号
- rtClaims["appSecret"] = appSecret //账号
- rtClaims["exp"] = td.RtExpires
- rt := jwt.NewWithClaims(jwt.SigningMethodHS256, rtClaims)
- td.RefreshToken, err = rt.SignedString([]byte(global.SystemConfig.Jwt.Signkey))
- if err != nil {
- return nil, err
- }
- return td, nil
- }
- func ExtractTokenMetadata(r *http.Request) (*model.AccessDetails, error) {
- token, err := VerifyToken(r)
- if err != nil {
- return nil, err
- }
- acc, err := Extract(token)
- if err != nil {
- return nil, err
- }
- return acc, nil
- }
- func TokenValid(r *http.Request) error {
- token, err := VerifyToken(r)
- if err != nil {
- return err
- }
- if _, ok := token.Claims.(jwt.Claims); !ok && !token.Valid {
- return err
- }
- return nil
- }
- func VerifyToken(r *http.Request) (*jwt.Token, error) {
- tokenString := ExtractToken(r)
- token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
- if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
- return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
- }
- return []byte(global.SystemConfig.Jwt.Signkey), nil
- })
- if err != nil {
- return nil, err
- }
- return token, nil
- }
- //get the token from the request header
- func ExtractToken(r *http.Request) string {
- bearToken := r.Header.Get("token")
- if len(bearToken) > 0 {
- return bearToken
- }
- return ""
- }
- func Extract(token *jwt.Token) (*model.AccessDetails, error) {
- claims, ok := token.Claims.(jwt.MapClaims)
- if ok && token.Valid {
- accessUuid, ok := claims["access_uuid"].(string)
- appId,appIdOk := claims["appId"].(string)
- appSecret,appSecretOk := claims["appSecret"].(string)
- if ok == false || appIdOk==false || appSecretOk==false {
- return nil, errors.New("unauthorized")
- } else {
- return &model.AccessDetails{
- TokenUuid: accessUuid,
- AppId: appId,
- AppSecret: appSecret,
- }, nil
- }
- }
- return nil, errors.New("something went wrong")
- }
|