Перейти к основному содержимому

Подключение в Next.js

Авторизация с подменой cookies для SSR

Для работы с микросервисом /au

Создание proxy axios

осторожно

Этот метод будет изменен в будущем

Для работы требуется axios:

yarn add axios

Дальше в core/utils мы создаем файл axios.ts с подобным содержимим.

axios.ts
import {cookies} from "next/headers"
import axios from "axios"

export const apiG7ff = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL,
})

apiG7ff.interceptors.request.use(async (config) => {
if (typeof window !== "undefined") {
return config
} else {
config.headers["Cookie"] = cookies().toString()
return config
}
})
ENV

NEXT_PUBLIC_API_URL - дожен ссылаться на один из доменов окружений api g7ff

Список:

Создание путевых экземпляров api

осторожно

Этот метод будет изменен в будущем

warning

Все экзкмпляры api должны находиться в core/api

Создаем файл api/auth.ts

Серверный файл

Обязательно используем дерективу "use server"

GET /au/auth - Проверка авторизации

import {apiG7ff} from "_utils/axios"

// boolean - true = авторизация пройдена, false = авторизация не пройдена
export async function getAuth() {
return apiG7ff
.get("/au/auth")
.then(() => true)
.catch(() => false)
}

POST /au/auth - Отправка кода

import {apiG7ff} from "_utils/axios"

// boolean | number - true = код отправлен, number = код не отправлен + статус, 408 означает что код уже отправлен и её нужно считать корректной, но уведомить пользователя о том что код не отправлен повторно
export async function auth(phone: string) {
return apiG7ff
.post("/au/auth", {phone, service: "erisa"})
.then(() => true)
.catch(({response}) => {
return response.status
})
}
Пример содержимого ошибки 408 для пользователя

Код уже был отправлен, повторная отправка возможна через время

POST /au/auth/confirm - Авторизация по коду

Серверный файл

Обязательно используем дерективу "use server"

"use server"

import {cookies} from "next/headers"

import {apiG7ff} from "_utils/axios"

export async function confirmCode(phone: string, code: string) {
return apiG7ff
.post("/au/auth/confirm", {phone, code})
.then((res) => {
res.headers["set-cookie"]?.map((cookie) => {
const [keyValue] = cookie.split("; ")
const [key, value] = keyValue.split("=")
const d = new Date()
d.setFullYear(d.getFullYear() + 1)
cookies().set({
name: key,
value,
httpOnly: true,
secure: process.env.NODE_ENV === "production",
expires: d,
})
})
return true
})
.catch(({response}) => {
return response.status
})
}
Код файла auth.ts
auth.ts
"use server"

import {cookies} from "next/headers"

import {apiG7ff} from "_utils/axios"

export async function getAuth() {
return apiG7ff
.get("/au/auth")
.then(() => true)
.catch(() => false)
}

export async function auth(phone: string) {
return apiG7ff
.post("/au/auth", {phone, service: "erisa"})
.then(() => true)
.catch(({response}) => {
return response.status
})
}

export async function confirmCode(phone: string, code: string) {
return apiG7ff
.post("/au/auth/confirm", {phone, code})
.then((res) => {
res.headers["set-cookie"]?.map((cookie) => {
const [keyValue] = cookie.split("; ")
const [key, value] = keyValue.split("=")
const d = new Date()
d.setFullYear(d.getFullYear() + 1)
cookies().set({
name: key,
value,
httpOnly: true,
secure: process.env.NODE_ENV === "production",
expires: d,
})
})
return true
})
.catch(({response}) => {
return response.status
})
}