添加会话过期时间的环境变量配置;撤销令牌接口权限改为验证用户令牌
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"platform/pkg/env"
|
||||
"platform/pkg/rds"
|
||||
"time"
|
||||
|
||||
@@ -20,9 +21,9 @@ type SessionServiceInter interface {
|
||||
// Find 通过访问令牌获取会话信息
|
||||
Find(ctx context.Context, token string) (*AuthContext, error)
|
||||
// Create 创建一个新的会话
|
||||
Create(ctx context.Context, auth AuthContext, config ...SessionConfig) (*TokenDetails, error)
|
||||
Create(ctx context.Context, auth AuthContext) (*TokenDetails, error)
|
||||
// Refresh 刷新一个会话
|
||||
Refresh(ctx context.Context, refreshToken string, config ...SessionConfig) (*TokenDetails, error)
|
||||
Refresh(ctx context.Context, refreshToken string) (*TokenDetails, error)
|
||||
// Remove 删除会话
|
||||
Remove(ctx context.Context, accessToken, refreshToken string) error
|
||||
}
|
||||
@@ -61,12 +62,8 @@ func (s *sessionService) Find(ctx context.Context, token string) (*AuthContext,
|
||||
}
|
||||
|
||||
// Create 创建一个新的会话
|
||||
func (s *sessionService) Create(ctx context.Context, auth AuthContext, config ...SessionConfig) (*TokenDetails, error) {
|
||||
// 解析可选配置
|
||||
cfg := DefaultSessionConfig
|
||||
if len(config) > 0 {
|
||||
cfg = mergeConfig(DefaultSessionConfig, config[0])
|
||||
}
|
||||
func (s *sessionService) Create(ctx context.Context, auth AuthContext) (*TokenDetails, error) {
|
||||
var now = time.Now()
|
||||
|
||||
// 生成令牌组
|
||||
accessToken := genToken()
|
||||
@@ -88,9 +85,12 @@ func (s *sessionService) Create(ctx context.Context, auth AuthContext, config ..
|
||||
}
|
||||
|
||||
// 事务保存数据到 Redis
|
||||
var accessExpire = time.Duration(env.SessionAccessExpire) * time.Second
|
||||
var refreshExpire = time.Duration(env.SessionRefreshExpire) * time.Second
|
||||
|
||||
pipe := rds.Client.TxPipeline()
|
||||
pipe.Set(ctx, accessKey(accessToken), authData, cfg.AccessTokenDuration)
|
||||
pipe.Set(ctx, refreshKey(refreshToken), refreshData, cfg.RefreshTokenDuration)
|
||||
pipe.Set(ctx, accessKey(accessToken), authData, accessExpire)
|
||||
pipe.Set(ctx, refreshKey(refreshToken), refreshData, refreshExpire)
|
||||
_, err = pipe.Exec(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -98,20 +98,16 @@ func (s *sessionService) Create(ctx context.Context, auth AuthContext, config ..
|
||||
|
||||
return &TokenDetails{
|
||||
AccessToken: accessToken,
|
||||
AccessTokenExpires: time.Now().Add(cfg.AccessTokenDuration),
|
||||
AccessTokenExpires: now.Add(accessExpire),
|
||||
RefreshToken: refreshToken,
|
||||
RefreshTokenExpires: time.Now().Add(cfg.RefreshTokenDuration),
|
||||
RefreshTokenExpires: now.Add(refreshExpire),
|
||||
Auth: auth,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Refresh 刷新一个会话
|
||||
func (s *sessionService) Refresh(ctx context.Context, refreshToken string, config ...SessionConfig) (*TokenDetails, error) {
|
||||
// 解析可选配置
|
||||
cfg := DefaultSessionConfig
|
||||
if len(config) > 0 {
|
||||
cfg = mergeConfig(DefaultSessionConfig, config[0])
|
||||
}
|
||||
func (s *sessionService) Refresh(ctx context.Context, refreshToken string) (*TokenDetails, error) {
|
||||
var now = time.Now()
|
||||
|
||||
rKey := refreshKey(refreshToken)
|
||||
var tokenDetails *TokenDetails
|
||||
@@ -153,8 +149,11 @@ func (s *sessionService) Refresh(ctx context.Context, refreshToken string, confi
|
||||
pipeline := tx.Pipeline()
|
||||
|
||||
// 保存新的令牌
|
||||
pipeline.Set(ctx, accessKey(newAccessToken), authData, cfg.AccessTokenDuration)
|
||||
pipeline.Set(ctx, refreshKey(newRefreshToken), newRefreshData, cfg.RefreshTokenDuration)
|
||||
var accessExpire = time.Duration(env.SessionAccessExpire) * time.Second
|
||||
var refreshExpire = time.Duration(env.SessionRefreshExpire) * time.Second
|
||||
|
||||
pipeline.Set(ctx, accessKey(newAccessToken), authData, accessExpire)
|
||||
pipeline.Set(ctx, refreshKey(newRefreshToken), newRefreshData, refreshExpire)
|
||||
|
||||
// 删除旧的令牌
|
||||
pipeline.Del(ctx, accessKey(refreshData.AccessToken))
|
||||
@@ -168,8 +167,8 @@ func (s *sessionService) Refresh(ctx context.Context, refreshToken string, confi
|
||||
tokenDetails = &TokenDetails{
|
||||
AccessToken: newAccessToken,
|
||||
RefreshToken: newRefreshToken,
|
||||
AccessTokenExpires: time.Now().Add(cfg.AccessTokenDuration),
|
||||
RefreshTokenExpires: time.Now().Add(cfg.RefreshTokenDuration),
|
||||
AccessTokenExpires: now.Add(accessExpire),
|
||||
RefreshTokenExpires: now.Add(refreshExpire),
|
||||
Auth: refreshData.AuthContext,
|
||||
}
|
||||
return nil
|
||||
@@ -204,38 +203,6 @@ func refreshKey(token string) string {
|
||||
|
||||
// endregion
|
||||
|
||||
// region SessionConfig
|
||||
|
||||
// SessionConfig 定义会话管理的配置选项
|
||||
type SessionConfig struct {
|
||||
// 令牌配置
|
||||
AccessTokenDuration time.Duration
|
||||
RefreshTokenDuration time.Duration
|
||||
}
|
||||
|
||||
// DefaultSessionConfig 默认会话配置
|
||||
var DefaultSessionConfig = SessionConfig{
|
||||
AccessTokenDuration: 2 * time.Hour,
|
||||
RefreshTokenDuration: 7 * 24 * time.Hour,
|
||||
}
|
||||
|
||||
// 合并配置,保留非零值
|
||||
func mergeConfig(defaultCfg SessionConfig, customCfg SessionConfig) SessionConfig {
|
||||
result := defaultCfg
|
||||
|
||||
if customCfg.AccessTokenDuration != 0 {
|
||||
result.AccessTokenDuration = customCfg.AccessTokenDuration
|
||||
}
|
||||
|
||||
if customCfg.RefreshTokenDuration != 0 {
|
||||
result.RefreshTokenDuration = customCfg.RefreshTokenDuration
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region AuthContext
|
||||
|
||||
// AuthContext 定义认证信息
|
||||
|
||||
Reference in New Issue
Block a user