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 }