access_by_lua_block
:- 使用 Lua 脚本进行鉴权操作。
local res = ngx.location.capture("/auth/check", { method = ngx.HTTP_GET, args = { token = ngx.var.http_authorization } })
:- 发送一个 GET 请求到
/auth/check
路径,传递token
参数,其值为客户端请求中的Authorization
头部。
- 发送一个 GET 请求到
if res.status ~= 200 then ngx.exit(res.status) end
:- 如果鉴权服务器返回的状态码不是 200(即鉴权失败),则直接返回鉴权服务器的响应状态码给客户端。
-
带有 Bearer Token 的请求:
http
GET /api/some-endpoint HTTP/1.1 Host: yourdomain.com Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
-
带有 Basic Auth 的请求:
http
GET /api/some-endpoint HTTP/1.1 Host: yourdomain.com Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
-
带有自定义 Token 的请求:
http
GET /api/some-endpoint HTTP/1.1 Host: yourdomain.com Authorization: CustomToken 1234567890abcdef
解释
-
Authorization
头部:- 这个头部用于传递鉴权信息。在 Nginx 配置中,
ngx.var.http_authorization
获取的就是这个头部的值。 Bearer
是最常见的 JWT(JSON Web Token)格式。Basic
是 Base64 编码的用户名和密码。CustomToken
是自定义的鉴权格式。
- 这个头部用于传递鉴权信息。在 Nginx 配置中,
浏览器在发送 HTTP 请求时会自动添加一些请求头,主要包括以下几种:
User-Agent: 提供关于浏览器的信息。
Accept: 指定客户端能够处理的内容类型。
Accept-Language: 指定客户端偏好的语言。
Accept-Encoding: 指定客户端支持的压缩编码格式。
Connection: 控制网络连接的持久性(例如,keep-alive 或 close)。
Host: 指定请求的目标主机和端口。
Referer: 指定当前请求的来源页面。
Origin: 指定请求的源域名,主要用于跨域请求。
Cache-Control: 控制缓存行为。
Cookie: 包含与请求相关的 cookie 信息
Next.js 的 Middleware 是一种中间件机制,允许你在请求到达最终的页面或 API 路由之前拦截和处理这些请求。Middleware 可以用于多种用途,包括身份验证、重定向、修改请求头等
主要功能
- 请求拦截:可以在请求到达目标路由之前进行拦截,从而执行一些操作。
- 身份验证:检查用户是否已登录,并根据结果决定是否继续处理请求或重定向到登录页面。
- 重定向:可以根据条件将请求重定向到其他 URL。
- 修改请求头:可以在请求中添加、删除或修改请求头信息。
- 缓存控制:可以通过设置响应头来控制缓存行为。
- 日志记录:记录每个请求的信息,便于调试和分析。
使用场景
- 访问控制:限制某些页面只能被特定用户访问。
- 国际化:根据用户的语言偏好自动重定向到相应的语言版本。
- 性能优化:通过缓存策略减少服务器负载。
- 安全性增强:防止恶意请求和攻击。
如何使用
要在 Next.js 中使用 Middleware,你需要创建一个名为 _middleware.js
或 _middleware.ts
文件,并将其放在你想要应用 Middleware 的目录下(例如,在根目录下的 _middleware.js
将应用于所有请求)。
{ ...options, headers }:
这是一个对象字面量,用于配置 fetch 请求的各种选项。
...options:
...options 是对象展开运算符,它将 options 对象的所有属性复制到新的对象中。
例如,如果 options 是 { method: 'POST', body: JSON.stringify({ key: 'value' }) },那么 ...options 会将这些属性展开到新对象中。
headers:
headers 是一个 Headers 对象,包含了请求头信息。
通过这种方式,你可以确保 headers 对象中的所有头部信息都被添加到请求中。
如果 options 对象中已经有一个 headers 属性,那么 headers 对象会覆盖 options 中的 headers 属性。
{ ...options, headers } 会展开 options 对象的所有属性,并添加或覆盖 headers 属性。
最终的对象将类似于:
{
method: 'POST',
body: '{"key":"value"}',
headers: Headers {
'Content-Type': 'application/json',
'Authorization': 'Bearer your-jwt-token'
}
}