Next.js 默认情况下是同站点来源,但我仍然可以访问它

2023-11-21

我想知道如何保护我的 api 路由。文档说,api 路由默认是同站点源。

API 路由不指定 CORS 标头,这意味着它们仅在默认情况下是同源的。您可以通过使用 cors 中间件包装请求处理程序来自定义此类行为。 Next.js 文档

但是,如果我使用像 Postman 这样的请求工具,我总是可以调用它并获取结果:

// Next.js API route support: https://nextjs.org/docs/api-routes/introduction

export default (req, res) => {
  res.status(200).json({ name: 'John Doe' })
}

这怎么可能?我只想限制对我的应用程序的访问。


您问题的第一部分的答案是:与邮差的 CORS.

对于第二部分,我利用短期访问令牌的概念编写了一个非常小的代码(太简化了)。

// utils/protector.js

let oldToken, newToken;
const checkToken = ({ headers: { 'x-access-token': token } }) =>
  token && (token === oldToken || token === newToken);

const refreshToken = () => {
  oldToken = newToken;
  newToken = Math.random().toString(36).substr(2);
  setTimeout(refreshToken, 3 * 60 * 60 * 1000); // each token is valid for 3 hrs
};
refreshToken();

export { checkToken, newToken as accessToken };
// api/user.js

import { checkToken } from '../../utils/protector';

const handler = (req, res) => {
  // just add this line to the top of your handler
  if (!checkToken(req)) return res.status(403).send();

  // your API logic here...
  res.status(200).json({ name: 'John Doe' });
};

export default handler;

现在在页面中您想要使用受保护的 API:

// index.js

import { useState, useEffect } from 'react';

import { accessToken } from '../utils/protector';

const Home = ({ accessToken }) => {
  const [user, setUser] = useState('Guest');

  useEffect(() => {
    // this will be called from the client
    fetch('/api/user', { headers: { 'x-access-token': accessToken } })
      .then((response) => response.json())
      .then((data) => setUser(data.name));

    return () => {};
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  return <div>Hello {user}!</div>;
};

const getServerSideProps = async () => {
  return { props: { accessToken } };
};

export default Home;
export { getServerSideProps };

使用受保护路由的任何页面都应该在服务器端呈现,否则保护器代码将与客户端捆绑在一起并在浏览器中执行,从而导致服务器端(API)和客户端产生不同的令牌。


的概念oldToken and newToken可能看起来很不清楚。认为:

  • 用户于 11:59 访问您的网站。

  • 您的令牌会在 00:00 刷新。

  • 他们在 12:01 触发了 API 调用。

  • 现在如果没有oldToken, the newToken在调用之前就会发生变化,并且响应将是 403 禁止错误。


我假设用户在您的页面上执行调用受保护 API 的操作之前只需要不到 3 小时的时间。

超时设置为 3 小时,即使令牌的有效时间是其时间的两倍,因为如果超时为一半(即 1.5 小时)并且(上述)用户在 01:31 触发 API 调用。然后oldToken is the newToken, and newToken较新,两者都与用户拥有的不匹配。

因此,为了保证收到的令牌至少在 3 小时内有效,总生存时间是两倍。令牌的有效期可能为 6 小时(例如对于 12:00 访问该网站的用户)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Next.js 默认情况下是同站点来源,但我仍然可以访问它 的相关文章

随机推荐

  • python中的k-means:确定哪些数据与每个质心相关联

    我一直在使用scipy cluster vq kmeans用于进行一些 k 均值聚类 但想知道是否有一种方法可以确定每个数据点 假定 与哪个质心相关联 显然你可以手动执行此操作 但据我所知 kmeans 函数不会返回此值 有一个功能kmea
  • 如何防止 pexpect 回显密码?

    默认情况下 pexpect spawn 不会输出任何东西 但是当我指定logfile sys stdout它还会回显密码 例如ssh 那么我怎样才能看到与spawned 进程没有回显密码 就像Expect the Tcl扩展 吗 预期示例
  • 使用 Google API 发送邮件时出错 - “'原始'RFC822 有效负载消息字符串或通过 /upload/* 需要 URL 上传消息”

    我正在尝试通过 python 中的 Google API 发送消息 并且正在尝试运行几乎直接从谷歌示例页面 def CreateMessage sender to subject message text message MIMEText
  • 如何在等距平铺地图中变换鼠标位置?

    因此 我设法自己编写了第一部分 算法 来计算每个图块在绘制此地图时应放置的位置 见下文 然而 我需要能够将鼠标位置转换为适当的单元格 而且我几乎要抓狂了 因为我无法找出如何从鼠标位置获取单元格的方法 我担心的是 它涉及一些相当高的数学知识
  • 使用 matplotlib 对极坐标图中的“单元格”进行着色

    我有一堆规则分布的点 n 6 r 1 8 每个点的值都在 0 1 中 我可以使用 matplotlib 中的值绘制它们 polar thetas rs c values 但是 我不想只有一个微薄的小点 而是用与该点的值相对应的颜色来对相应的
  • 使用 out 参数反思静态重载方法

    我在通过反射调用带有输出参数的重载静态方法时遇到一些问题 并且希望得到一些指针 我正在寻找动态创建类似的类型System Int32 or System Decimal 然后调用静态TryParse string out x 方法就可以了
  • Python Pandas - 查找具有最大聚合值的连续组

    我有一个包含日期时间和整数的数据框 import numpy as np import pandas as pd df pd DataFrame df dt pd date range 2017 01 01 12 00 2017 01 01
  • 如何在 PostgreSQL 中以编程方式查找继承表?

    我有一个 PostgreSQL 8 3 数据库 其中使用了表继承 我想获取所有表及其模式名称的列表 该模式名称是使用查询从基表继承的 我们有什么办法可以使用 PGSQL 得到这个吗 由于您使用的是旧版本的 PostgreSQL 您可能必须使
  • AutoMapper 无法将 enum 转换为 nullable int?

    我收到 AutoMapperMappingException 异常 引发了 AutoMapper AutoMapperMappingException 类型的异常 gt System InvalidCastException 从 Dummy
  • OpenGL 将纹理映射到球体

    我有 OpenGL 程序 我想用地球位图来纹理球体 我在 Blender 中准备了网格并将其导出为 OBJ 文件 程序正确加载适当的网格数据 顶点 uv 和法线 和位图 我已经检查了它与骨骼位图的纹理立方体 我的程序是纹理球体 但不正确 或
  • 接口的所有方法都是抽象的吗?

    我看到大多数地方都写着 All of the methods in an interface are abstract 但接口也可能包含default methods and static methods方法体存在于默认方法和静态方法中 那
  • 哪个 PDF 生成 API (Java) 支持古吉拉特语字体?

    我尝试过 iText PDFBox 和 Oracle Forms 我还成功地使用 iText 生成了古吉拉特语 PDF 文档 但是 不幸的是它没有生成古吉拉特语 UTF 8 语言的正确字体 我的项目是 jdk 1 4 这是强制使用的 所以
  • 按具有最大列值的记录过滤 Django 查询

    有没有一种简单的方法可以根据列中具有最大 最小值的记录来过滤 Django 查询 我本质上是在问these 问题 但是在 Django 的 ORM 的特定上下文中 e g 假设我有一个模型旨在存储每个人电话号码的历史值 class Pers
  • 将 TabControl ItemsSource 绑定到 ViewModel 集合

    由于某种原因 我很难得到我的TabControl绑定时正确显示ItemsSource to a ObservableCollection视图模型 我的设计基于此处找到的教程 http msdn microsoft com en us mag
  • Resharper 单元测试运行程序找不到内容文件

    我有一些测试依赖于我标记为 内容 和 始终复制 的一些文件 我使用 DeploymentItem 属性来确保在 VS 外部运行 mstest 时将它们复制到输出目录 然而 当在 VS 中使用 Resharper 测试运行器时 这些文件永远不
  • F# - int 类型与 unit 类型不兼容

    对于函数式语言来说相当陌生 但我正在使用大量 F 维护别人的代码 谁能对此提供一些见解 let mtvCap Rendering MTViewerCapture mtViewer mtvCap GetCapture mtvCap ToWpf
  • SQL 过程中的打印语句会影响性能吗?

    我正在使用 SQL Server 程序并且我有使用的习惯Print存储过程中的语句用于区分过程代码 我的数据库中有近 200 250 个过程 print 语句应该影响性能吗 我正在开发多用户 Windows 应用程序 我发现在我的桌面上运行
  • ASP.NET MVC 从 URL 获取路由值

    我想计算出该路线的价值是多少UrlReferrer在控制器的动作中 我无法弄清楚传入的 URL 在 MVC 管道的哪一部分被转换为 RouteValues 我想要实现的目标与此接近 你需要打电话RouteTable Routes GetRo
  • 调用 Node.js fork 时处理“找不到模块”错误

    如何捕获调用不存在的文件的 fork 错误 var cp require child process var fk cp fork missing file js 喷出 module js 340 throw err Error Canno
  • Next.js 默认情况下是同站点来源,但我仍然可以访问它

    我想知道如何保护我的 api 路由 文档说 api 路由默认是同站点源 API 路由不指定 CORS 标头 这意味着它们仅在默认情况下是同源的 您可以通过使用 cors 中间件包装请求处理程序来自定义此类行为 Next js 文档 但是 如