github.com/cnotch/ipchub@v1.1.0/provider/auth/token.go (about)

     1  // Copyright (c) 2019,CAOHONGJU All rights reserved.
     2  // Use of this source code is governed by a MIT-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package auth
     6  
     7  import (
     8  	"sync"
     9  	"time"
    10  
    11  	"github.com/cnotch/ipchub/provider/security"
    12  )
    13  
    14  // Token 用户登录后的Token
    15  type Token struct {
    16  	Username string `json:"-"`
    17  	AToken   string `json:"access_token"`
    18  	AExp     int64  `json:"-"`
    19  	RToken   string `json:"refresh_token"`
    20  	RExp     int64  `json:"-"`
    21  }
    22  
    23  // TokenManager token管理
    24  type TokenManager struct {
    25  	tokens sync.Map // token->Token
    26  }
    27  
    28  // NewToken 给用户新建Token
    29  func (tm *TokenManager) NewToken(username string) *Token {
    30  	token := &Token{
    31  		Username: username,
    32  		AToken:   security.NewID().MD5(),
    33  		AExp:     time.Now().Add(time.Hour * time.Duration(2)).Unix(),
    34  		RToken:   security.NewID().MD5(),
    35  		RExp:     time.Now().Add(time.Hour * time.Duration(7*24)).Unix(),
    36  	}
    37  
    38  	tm.tokens.Store(token.AToken, token)
    39  	tm.tokens.Store(token.RToken, token)
    40  	return token
    41  }
    42  
    43  // Refresh 刷新指定的Token
    44  func (tm *TokenManager) Refresh(rtoken string) *Token {
    45  	ti, ok := tm.tokens.Load(rtoken)
    46  	if ok {
    47  		oldToken := ti.(*Token)
    48  		username := oldToken.Username
    49  		if rtoken == oldToken.RToken { // 是refresh token
    50  			tm.tokens.Delete(oldToken.AToken)
    51  			tm.tokens.Delete(oldToken.RToken)
    52  			if oldToken.RExp > time.Now().Unix() {
    53  				return tm.NewToken(username)
    54  			}
    55  		}
    56  	}
    57  	return nil
    58  }
    59  
    60  // AccessCheck 访问检测
    61  func (tm *TokenManager) AccessCheck(atoken string) string {
    62  	ti, ok := tm.tokens.Load(atoken)
    63  	if ok {
    64  		token := ti.(*Token)
    65  		if token.AToken == atoken { // 访问token
    66  			if token.AExp > time.Now().Unix() {
    67  				return token.Username
    68  			}
    69  			tm.tokens.Delete(token.AToken)
    70  		}
    71  	}
    72  	return ""
    73  }
    74  
    75  // ExpCheck 过期检测
    76  func (tm *TokenManager) ExpCheck() {
    77  	tm.tokens.Range(func(k, v interface{}) bool {
    78  		token := v.(*Token)
    79  		if time.Now().Unix() > token.AExp {
    80  			tm.tokens.Delete(token.AToken)
    81  		}
    82  		if time.Now().Unix() > token.RExp {
    83  			tm.tokens.Delete(token.RToken)
    84  		}
    85  		return true
    86  	})
    87  }