gpt4 book ai didi

next.js - 使用 next-auth 凭据提供程序时如何发送 httponly cookie 客户端?

转载 作者:行者123 更新时间:2023-12-04 14:07:11 24 4
gpt4 key购买 nike

我正在创建下一个 js 应用程序,使用 next-auth 来处理身份验证。
我有一个外部后端 api,所以我使用的是凭据提供程序。
问题是后端发送了 httponly cookie,但是当我向客户端发出请求时,这些 cookie 没有附加到浏览器。
在/pages/api/[...auth].js

import NextAuth from 'next-auth';
import Providers from 'next-auth/providers';
import clientAxios from '../../../config/configAxios'

export default NextAuth({
providers: [
Providers.Credentials({
async authorize(credentials) {
try {
const login = await clientAxios.post('/api/login', {
username: credentials.username,
password: credentials.password,
is_master: credentials.is_master
})


const info = login.data.data.user
const token = {
accessToken: login.data.data.access_token,
expiresIn: login.data.data.expires_in,
refreshToken: login.data.data.refresh_token
}
// I can see cookies here
const cookies = login.headers['set-cookie']

return { info, token, cookies }
} catch (error) {
console.log(error)
throw (Error(error.response.data.M))
}
}
})
],
callbacks: {
async jwt(token, user, account, profile, isNewUser) {
if (token) {
// Here cookies are set but only in server side
clientAxios.defaults.headers.common['Cookie'] = token.cookies
}
if (user) {
token = {
user: user.info,
...user.token,
}
}

return token
},
async session(session, token) {
// Add property to session, like an access_token from a provider.
session.user = token.user
session.accessToken = token.accessToken
session.refreshToken = token.refreshToken

return session
}
},
session: {
jwt: true
}
})
我的 axios 配置文件
import axios from 'axios';

const clientAxios = axios.create({

baseURL: process.env.backendURL,
withCredentials: true,
headers:{
'Accept' : 'application/json',
'Content-Type' : 'application/json'
}

});

export default clientAxios;
一个页面组件
import { getSession } from "next-auth/client";
import clientAxios from "../../../config/configAxios";
import { useEffect } from "react"

export default function PageOne (props) {
useEffect(async () => {
// This request fails, cookies are not sent
const response = await clientAxios.get('/api/info');
}, [])

return (
<div>
<h1>Hello World!</h1>
</div>
)
}

export async function getServerSideProps (context) {
const session = await getSession(context)

if (!session) {
return {
redirect: {
destination: '/login',
permanent: false
}
}
}

// This request works
const response = await clientAxios.get('/api/info');

return {
props: {
session,
info: response.data
}
}
}

最佳答案

经过一段时间的研究,我已经弄清楚了。
我必须以导出 NextAuth 的方式在/pages/api/auth 中进行更改。
代替

export default NextAuth({
providers: [
...
]

})

像这样导出它,所以我们可以访问请求和响应对象
export default (req, res) => {
return NextAuth(req, res, options)
}
但是要在选项对象中访问它们,我们可以将其设置为回调
const nextAuthOptions = (req, res) => {
return {
providers: [
...
]
}
}

export default (req, res) => {
return NextAuth(req, res, nextAuthOptions(req, res))
}
要将 cookie 从后端发送回前端,我们必须在响应中添加一个“Set-Cookie” header
res.setHeader('Set-Cookie', ['cookie_name=cookie_value'])
完整的代码将是
import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';

const nextAuthOptions = (req, res) => {
return {
providers: [
CredentialsProvider({
async authorize(credentials) {
try {
const response = await axios.post('/api/login', {
username: credentials.username,
password: credentials.password
})

const cookies = response.headers['set-cookie']

res.setHeader('Set-Cookie', cookies)

return response.data
} catch (error) {
console.log(error)
throw (Error(error.response))
}
}
})
]
}
}

export default (req, res) => {
return NextAuth(req, res, nextAuthOptions(req, res))
}

关于next.js - 使用 next-auth 凭据提供程序时如何发送 httponly cookie 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67594977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com