This commit is contained in:
2026-08-20 13:39:18 +08:00
parent 3c229f807c
commit 4df6a5f571
2 changed files with 31 additions and 3 deletions
+25
View File
@@ -66,6 +66,20 @@ function loginResponse(accessToken = token(), refreshToken = 'refresh-next') {
} }
} }
function domesticOnlyLoginResponse() {
return {
code: '200',
message: 'success',
data: {
tokenType: 'Bearer',
accessToken: token(),
expiresIn: 1800,
refreshToken: 'refresh-domestic',
refreshExpiresIn: 604800,
},
}
}
describe('admin auth session', () => { describe('admin auth session', () => {
beforeEach(() => { beforeEach(() => {
vi.stubGlobal('localStorage', createMemoryStorage()) vi.stubGlobal('localStorage', createMemoryStorage())
@@ -75,6 +89,17 @@ describe('admin auth session', () => {
mocks.refreshHandler = null mocks.refreshHandler = null
}) })
it('accepts a domestic-only token response when the test environment has no overseas services', async () => {
mocks.post.mockResolvedValue(domesticOnlyLoginResponse())
mocks.listCurrentPlatformPermissionCodes.mockResolvedValue(['platform:warehouse:list'])
const auth = useAuthStore()
await auth.login('platform_admin', 'password')
expect(auth.isAuthenticated).toBe(true)
expect(auth.refreshToken).toBe('refresh-domestic')
})
it('loads permissions from the current authorization endpoint when the JWT only contains identity', async () => { it('loads permissions from the current authorization endpoint when the JWT only contains identity', async () => {
mocks.post.mockResolvedValue(loginResponse()) mocks.post.mockResolvedValue(loginResponse())
mocks.listCurrentPlatformPermissionCodes.mockResolvedValue(['platform:warehouse:list']) mocks.listCurrentPlatformPermissionCodes.mockResolvedValue(['platform:warehouse:list'])
+6 -3
View File
@@ -24,8 +24,8 @@ interface LoginResponse {
expiresIn: number expiresIn: number
refreshToken: string refreshToken: string
refreshExpiresIn: number refreshExpiresIn: number
overseasAccessToken: string | null overseasAccessToken?: string | null
overseasExpiresIn: number overseasExpiresIn?: number
} }
class ExpiredAccessTokenError extends Error {} class ExpiredAccessTokenError extends Error {}
@@ -90,7 +90,10 @@ export const useAuthStore = defineStore('admin-auth', () => {
async function applySession(result: LoginResponse, expectedGeneration: number) { async function applySession(result: LoginResponse, expectedGeneration: number) {
const session = sessionFromToken(result.accessToken) const session = sessionFromToken(result.accessToken)
ensureCurrentGeneration(expectedGeneration) ensureCurrentGeneration(expectedGeneration)
replaceOverseasAccessToken(result.overseasAccessToken, result.overseasExpiresIn) replaceOverseasAccessToken(
result.overseasAccessToken ?? null,
result.overseasExpiresIn ?? 0,
)
token.value = result.accessToken token.value = result.accessToken
refreshToken.value = result.refreshToken refreshToken.value = result.refreshToken
user.value = session.user user.value = session.user