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 }