93 lines
4.4 KiB
Go
93 lines
4.4 KiB
Go
package usecase
|
||
|
||
import (
|
||
"context"
|
||
|
||
"code.30cm.net/digimon/app-cloudep-permission-server/pkg/domain/entity"
|
||
"github.com/golang-jwt/jwt/v4"
|
||
)
|
||
|
||
type TokenUseCase interface {
|
||
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)
|
||
// ReadTokenBasicData 檢查Token 帶的資料
|
||
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
|
||
}
|