我正在开发一个SveltKit应用程序,并使用Cognito作为我的身份验证提供商。对于我正在调用的一个AWS API(
IsAuthorizedWithToken
),我需要提供登录用户的访问/身份令牌。本质上,我想以某种方式在我的一个
+page.server.ts
文件
// somefolder/+page.server.ts
export async function load({ locals }) {
const session = await locals.getSession();
const { id_token, access_token } = session
// Make use of id_token, access_token
}
灵感来自
how to get the provider access token in next-auth
,我使用了
jwt
回调以在用户登录时获取令牌。我验证了令牌在
session
使用控制台日志。
然而,只要我刷新页面,令牌就会变成
undefined
即使用户仍然登录,并且我可以访问会话中的其他属性,如
user.email
。通过这一点,我推断出只有当用户登录时,令牌才可用,而不是用于后续请求。
// hooks.server.ts
import { SvelteKitAuth } from '@auth/sveltekit';
import Cognito from '@auth/core/providers/cognito';
import { AUTH_SECRET, COGNITO_USER_POOL_ID, COGNITO_CLIENT_SECRET } from '$env/static/private';
import { PUBLIC_COGNITO_CLIENT_ID } from '$env/static/public';
import type { Handle } from '@sveltejs/kit';
// https://authjs.dev/reference/sveltekit
export const handle = SvelteKitAuth({
secret: AUTH_SECRET,
providers: [
// https://authjs.dev/reference/core/providers_cognito
Cognito({
clientId: PUBLIC_COGNITO_CLIENT_ID,
clientSecret: COGNITO_CLIENT_SECRET,
issuer: `https://cognito-idp.us-east-1.amazonaws.com/${COGNITO_USER_POOL_ID}`
})
],
callbacks: {
async session({ session, token }) {
session.user && (session.user.sub = token.sub);
session.access_token = token.accessToken as string;
session.id_token = token.id_token as string;
console.log(session);
return session;
},
async jwt({ token, account }) {
if (account) {
token.access_token = account.access_token;
token.id_token = account.id_token;
}
return token;
}
}
}) satisfies Handle;
Q1:为什么代币只在用户登录时可用,而不用于后续请求?SvelteKitAuth在用代币做什么?
Q2:是什么
correct
获取我的代币的方式
+page.server.ts
?
虽然能得到一个解决我目前问题的答案会很好,但我有兴趣了解事情为什么会这样。
GitHub问题还造成:
https://github.com/nextauthjs/next-auth/issues/8156