代码之家  ›  专栏  ›  技术社区  ›  bluprince13

在Cognito中使用SveltKitAuth时,如何获取access_token或id_token?

  •  0
  • bluprince13  · 技术社区  · 2 年前

    我正在开发一个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

    0 回复  |  直到 2 年前
        1
  •  1
  •   Grum    2 年前

    编辑

    您的会话回调中有一个拼写错误:

    session.access_token = token.accessToken as string;
    

    应该是:

    session.access_token = token.access_token as string;
    

    token 在具有属性的jwt回调中创建 token.access_token 而不是 token.accessToken 。这就是为什么 session.access_token undefined .

    然后,Cognito令牌应该可以在页面上的后续请求中使用。