fix(auth): avoid cabinet redirect loop and use teams access token

This commit is contained in:
Ruslan Bakiev
2026-04-21 12:55:19 +07:00
parent 351125b51d
commit 7b4eaeeb92
2 changed files with 17 additions and 8 deletions

View File

@@ -12,8 +12,10 @@ export default defineNuxtRouteMiddleware(async (to) => {
}
const { loggedIn } = useAuth()
const localePath = useLocalePath()
const logtoUser = useState<Record<string, unknown> | null>('logto-user', () => null)
if (!loggedIn.value) {
return navigateTo('/sign-in')
if (!loggedIn.value && !logtoUser.value) {
return navigateTo(localePath('/sign-in'))
}
})

View File

@@ -32,14 +32,21 @@ export default defineEventHandler(async (event) => {
const client = event.context.logtoClient as LogtoClient | undefined
if (!client) return
let idToken: string | null = null
const logtoUser = event.context.logtoUser as { organizations?: string[] } | undefined
const organizationId = event.context.logtoOrgId || logtoUser?.organizations?.[0]
let token: string | null = null
try {
idToken = await client.getIdToken()
token = await client.getAccessToken('https://teams.optovia.ru', organizationId)
} catch {
return
try {
token = await client.getIdToken()
} catch {
return
}
}
if (!idToken) return
if (!token) return
try {
const { GetMeDocument, GetMeProfileDocument } = await import('~/composables/graphql/user/teams-generated')
@@ -48,12 +55,12 @@ export default defineEventHandler(async (event) => {
const [meResponse, profileResponse] = await Promise.all([
$fetch<{ data?: { me?: MePayload } }>(endpoint, {
method: 'POST',
headers: { Authorization: `Bearer ${idToken}` },
headers: { Authorization: `Bearer ${token}` },
body: { query: print(GetMeDocument) }
}),
$fetch<{ data?: { me?: MePayload } }>(endpoint, {
method: 'POST',
headers: { Authorization: `Bearer ${idToken}` },
headers: { Authorization: `Bearer ${token}` },
body: { query: print(GetMeProfileDocument) }
})
])