Настройка сеанса AuthJSJavascript

Форум по Javascript
Ответить
Anonymous
 Настройка сеанса AuthJS

Сообщение Anonymous »

Я создаю функцию входа в систему в Next.js, используя AuthJS (ранее Next-Auth). Я использую стратегию JWT для управления сеансами и хотел бы дополнить данные сеанса, включив в них роль, которая будет определять, на какую панель управления перенаправляется пользователь при входе в систему, а также служить другим целям авторизации в дальнейшем.
Что я пробовал:
До сих пор я пытался изменить интерфейсы сеанса и пользователя модуля next-auth (как показано в типе def, следуя руководству next.js), а затем внедрите свойства из пользовательского запроса в JWT и сеанс в надежде, что они сохранятся на протяжении всего сеанса. Я работаю с поставщиком учетных данных, использую стратегию JWT, и запросы с использованием моего бэкэнда Python FastAPI работают нормально (проверено с помощью ведения журнала консоли).
Поведение:
Когда я регистрирую то, что auth.ts извлекает из внутреннего запроса для проверки существования пользователя, я получаю действительный результат, который сохраняется как {user_id: номер, электронная почта: строка, роль: строка . Когда я проверяю данные сеанса вошедшего в систему пользователя, auth.config.ts предоставляет { email: string , в котором отсутствуют свойства user_id и email.
auth.config.ts
import type { NextAuthConfig } from 'next-auth';

export const authConfig = {
pages: {
signIn: '/login',
},
session: {
strategy: 'jwt',
},
callbacks: {
authorized({ auth, request: { nextUrl } }) {
const user = auth?.user;
const isLoggedIn = !!user;
const role = user?.role;

const isProtectedRoute = /^\/(admin|tutor|student|parent)\/dashboard/.test(nextUrl.pathname);

if (isProtectedRoute) {
if (isLoggedIn) {
const expectedPathStart = `/${role}`;

if (!nextUrl.pathname.startsWith(expectedPathStart)) {
return Response.redirect(new URL(`${expectedPathStart}/dashboard`, nextUrl));
}
return true;
}
return false;
}

if (isLoggedIn && (nextUrl.pathname === '/login/')) {
return Response.redirect(new URL(`/${role}/dashboard`, nextUrl));
}

return true;
},
},
providers: [], // Add providers in auth.ts since that is not just compatible with node runtimes like auth.config.ts
} satisfies NextAuthConfig;

auth.ts
import NextAuth from 'next-auth';
import { authConfig } from './auth.config';
import Credentials from 'next-auth/providers/credentials';
import { z } from 'zod';

export const { auth, signIn, signOut } = NextAuth({
...authConfig,
providers: [
Credentials({
async authorize(credentials) {
const parsedCredentials = z
.object({ email: z.email(), password: z.string().min(6) })
.safeParse(credentials);

if (parsedCredentials.success) {
const { email, password } = parsedCredentials.data;
// send credentials to backend for checking using Python FastAPI
const res = await fetch(`${process.env.BACKEND_URL}/auth/login`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password })
}
)
if (!res.ok) {
return null;
}
const user = await res.json();

if (user) {
return user
}
return null;
},
}),
],
callbacks: {
async jwt({ token, user }) {
if(user) {
token.user_id = user.user_id
token.email = user.email
token.role = user.role
}
return token
},
async session({ session, token }) {
return {
...session,
user: {
...session.user,
user_id: token.user_id as string,
email: token.email as string,
role: token.role as string
}
}
},
}
});

next-auth.d.ts
import { DefaultSession } from "next-auth"

declare module "next-auth" {
interface User {
user_id: string
email: string
role: string // adding this so that ../auth.ts can access role on users without type errors
}
interface Session {
user: User & DefaultSession["user"]
expires: string
error: string
}
}

declare module "next-auth/jwt" {
interface JWT {
user_id: string
email: string
role: string
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... tomization
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»