2025-02-12 01:51:46 +00:00
|
|
|
|
package usecase
|
|
|
|
|
|
2025-02-13 11:06:51 +00:00
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
|
|
|
|
|
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity"
|
|
|
|
|
"github.com/golang-jwt/jwt/v4"
|
|
|
|
|
)
|
2025-02-12 01:51:46 +00:00
|
|
|
|
|
|
|
|
|
type TokenUseCase interface {
|
2025-02-13 11:06:51 +00:00
|
|
|
|
ParseClaims
|
|
|
|
|
// GenerateAccessToken 產生新的 Access Token
|
|
|
|
|
GenerateAccessToken(ctx context.Context, req GenerateTokenRequest) (AccessTokenResponse, error)
|
|
|
|
|
// RefreshAccessToken 使用 Refresh Token 更新 Access Token(刷新令牌)
|
|
|
|
|
RefreshAccessToken(ctx context.Context, req RefreshTokenRequest) (RefreshTokenResponse, error)
|
|
|
|
|
// RevokeToken 撤銷單個 Token
|
|
|
|
|
RevokeToken(ctx context.Context, req TokenRequest) error
|
|
|
|
|
// VerifyToken 驗證 Token 是否有效
|
|
|
|
|
VerifyToken(ctx context.Context, req TokenRequest) (VerifyTokenResponse, error)
|
|
|
|
|
// RevokeTokensByUID 根據 UID 撤銷所有 Token
|
|
|
|
|
RevokeTokensByUID(ctx context.Context, req RevokeTokensByUIDRequest) error
|
|
|
|
|
// RevokeTokensByDeviceID 根據 Device ID 取消所有相關的 Token
|
|
|
|
|
RevokeTokensByDeviceID(ctx context.Context, deviceID string) error
|
|
|
|
|
// GetUserTokensByDeviceID 根據 Device ID 獲取所有 AccessToken
|
|
|
|
|
GetUserTokensByDeviceID(ctx context.Context, deviceID string) ([]*AccessTokenResponse, error)
|
|
|
|
|
// GetUserTokensByUID 根據 UID 獲取所有 AccessToken
|
|
|
|
|
GetUserTokensByUID(ctx context.Context, uid string) ([]*AccessTokenResponse, error)
|
2025-02-12 01:51:46 +00:00
|
|
|
|
// ReadTokenBasicData 檢查Token 帶的資料
|
2025-02-13 11:06:51 +00:00
|
|
|
|
ReadTokenBasicData(ctx context.Context, token string) (Additional, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ParseClaims interface {
|
|
|
|
|
// CreateAccessToken 建立 access token
|
|
|
|
|
CreateAccessToken(token entity.Token, data any, secretKey string) (string, error)
|
|
|
|
|
// CreateRefreshToken 建立 RefreshToken
|
|
|
|
|
CreateRefreshToken(accessToken string) string
|
|
|
|
|
// ParseJWTClaimsByAccessToken 使用Access Token 解析出 JWT 資訊
|
|
|
|
|
ParseJWTClaimsByAccessToken(accessToken string, secret string, validate bool) (jwt.MapClaims, error)
|
|
|
|
|
// ParseSystemClaimsByAccessToken 使用Access Token 解析出 系統資訊
|
|
|
|
|
ParseSystemClaimsByAccessToken(accessToken string, secret string, validate bool) (map[string]string, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GenerateTokenRequest 定義授權請求的結構
|
|
|
|
|
type GenerateTokenRequest struct {
|
|
|
|
|
TokenType string `json:"token_type"` // 告訴前端Token 類型
|
|
|
|
|
DeviceID string `json:"device_id"` // 設備 ID
|
|
|
|
|
Scope string `json:"scope"` // 授權範圍
|
|
|
|
|
Expires int64 `json:"expires"` // 指定過期時間 UnixNano UTC 時間(沒給 = now 加設定秒數)
|
|
|
|
|
RefreshExpires int64 `json:"refresh_expires"` // 指定過期時間 UnixNano UTC 時間(沒給 = now 加設定秒數)
|
|
|
|
|
Role string `json:"role"` // 是否為刷新令牌
|
|
|
|
|
Account string `json:"account"` // 登入時用的帳號
|
|
|
|
|
UID string `json:"uid"` // 使用者在系統中的帳號
|
|
|
|
|
Data map[string]string `json:"data"` // 附加數據 -> 不在上面的以後要額外放進來的
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// AccessTokenResponse 定義訪問令牌響應的結構
|
|
|
|
|
type AccessTokenResponse struct {
|
|
|
|
|
AccessToken string `json:"access_token"` // 訪問令牌
|
|
|
|
|
ExpiresIn int64 `json:"expires_in"` // 過期時間 UnixNano UTC 時間
|
|
|
|
|
RefreshToken string `json:"refresh_token"` // 刷新令牌
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RefreshTokenRequest 更新 Token 的請求
|
|
|
|
|
type RefreshTokenRequest struct {
|
|
|
|
|
Token string `json:"token"` // 令牌
|
|
|
|
|
Scope string `json:"scope"` // 授權範圍
|
|
|
|
|
Expires int64 `json:"expires"` // 指定過期時間 UnixNano UTC 時間(沒給 = now 加設定秒數)
|
|
|
|
|
RefreshExpires int64 `json:"refresh_expires"` // 指定過期時間 UnixNano UTC 時間(沒給 = now 加設定秒數)
|
|
|
|
|
DeviceID string `json:"device_id"` // 設備 ID
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// RefreshTokenResponse 更新令牌的響應
|
|
|
|
|
type RefreshTokenResponse struct {
|
|
|
|
|
AccessToken string `json:"token"` // 新的訪問令牌
|
|
|
|
|
RefreshToken string `json:"refresh_token"` // 更新令牌
|
|
|
|
|
ExpiresIn int64 `json:"expires_in"` // 過期時間(秒)
|
|
|
|
|
TokenType string `json:"token_type"` // 令牌類型
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type TokenRequest struct {
|
|
|
|
|
Token string `json:"token"` // 需要註銷的令牌
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type VerifyTokenResponse struct {
|
|
|
|
|
Token entity.Token `json:"token"` // Token 詳情
|
|
|
|
|
Data map[string]string `json:"data"` // 附加資料
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type RevokeTokensByUIDRequest struct {
|
|
|
|
|
IDs []string `json:"ids"` // Token ID 列表
|
|
|
|
|
UID string `json:"uid"` // 用戶 ID
|
2025-02-12 01:51:46 +00:00
|
|
|
|
}
|