Я создаю функцию входа в систему в 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
Настройка сеанса AuthJS ⇐ Javascript
Форум по Javascript
1767725733
Anonymous
Я создаю функцию входа в систему в Next.js, используя AuthJS (ранее Next-Auth). Я использую стратегию JWT для управления сеансами и хотел бы дополнить данные сеанса, включив в них роль, которая будет определять, на какую панель управления перенаправляется пользователь при входе в систему, а также служить другим целям авторизации в дальнейшем.
[b]Что я пробовал[/b]:
До сих пор я пытался изменить интерфейсы сеанса и пользователя модуля next-auth (как показано в типе def, следуя руководству next.js), а затем внедрите свойства из пользовательского запроса в JWT и сеанс в надежде, что они сохранятся на протяжении всего сеанса. Я работаю с поставщиком учетных данных, использую стратегию JWT, и запросы с использованием моего бэкэнда Python FastAPI работают нормально (проверено с помощью ведения журнала консоли).
[b]Поведение:[/b]
Когда я регистрирую то, что 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
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79861848/authjs-session-customization[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия