reactjs 访问Nextjs httponly cookie

jjhzyzn0  于 2023-02-03  发布在  React
关注(0)|答案(1)|浏览(233)

我在Nextjs应用程序上工作,我想使用php laravel API添加auth。所以我在搜索在应用程序中存储令牌的最佳方法,我发现它是通过httponly cookie存储的,这就是我使用api路由来存储它的方法。但现在我面临的问题是如何在客户端发送到api的每个请求上发送令牌。
现在我使用getServerSideProps来获取令牌,然后通过props将其发送到所需的组件,但这种解决方案是多余的,一点也不方便。我使用getServerSideProps只是为了在需要与后端通信的任何页面上获取令牌。
那么有没有什么方法可以在每次请求时转发令牌,而不需要从服务器端获取令牌并将其发送到客户端?或者你认为有没有更好的方法将令牌存储在其他地方?

gywdnpxw

gywdnpxw1#

如果您有一个httpOnly cookie,并且您不想将其暴露给客户端,我不建议将其作为prop在getServerSideProps中传递给组件。这将暴露您的令牌,并且存在脚本访问cookie的风险。如果cookie是HttpOnly,则意味着无法通过客户端脚本访问它。相反,你可以创建一个NextJS api并在那里访问你的令牌。然后在你的应用中调用那个API。
这是一个如何在nextjs API中访问cookie的示例:

// src > pages > api > endpoint.js
export default async function (req, res) {
  // assuming there is a token in your cookie
  const token = req.headers.cookie.token;

  // Attach the token to the headers of each request
  const fetchWithToken = (url, options = {}) => {
    options.headers = options.headers || {};
    options.headers.Authorization = `Bearer ${token}`;
    return fetch(url, options);
  };

  // Your API logic here
  // ...
}

现在在客户端的组件中,您可以轻松地使用/api/endpoint/中的新端点,而不是使用令牌调用API。在此方法中,您永远不会将令牌暴露给浏览器:

import { useState, useEffect } from 'react';

const MyComponent = () => {
  const [data, setData] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      const res = await fetch('/api/endpoint');
      const data = await res.json();
      setData(data);
    };

    fetchData();
  }, []);

  // Your component logic here
  // ...
};

export default MyComponent;

相关问题