我有兴趣捕获用户首次提交到我的网站时的互联网协议 (IP) 地址。我的印象是 SvelteKit 提交与其他 Node.js 服务器解决方案类似。
我已经看完了this帖子,但我在提交给SvelteKit中的API服务器的请求中没有看到像
req.headers['x-forwarded-for']
或req.socket.remoteAddress
这样的远程内容。
这是我在请求中看到的内容(通过 API 提交中的控制台日志):
arg1:
body: (... data ... )
Headers:
accept:'*/*'
accept-encoding:'gzip, deflate'
accept-language:'en-US,en;q=0.9'
connection:'keep-alive'
content-length:'141'
content-type:'text/plain;charset=UTF-8'
cookie:'userid=c03efd10-3085-46cb-bacd-9eaeb605426e'
host:'192.168.1.22:3000'
origin:'http://192.168.1.22:3000'
referer:'http://192.168.1.22:3000/learn'
user-agent:'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
locals:
userid: '....'
method: 'POST'
params: {}
path: '/api/user_form'
query: ...
rawBody: ...
绝对没有
socket
,没有['x-forwarded-for']
的标题
注意,我正在本地网络上进行此操作。主机位于同一网络中的一台计算机上,客户端位于另一台计算机上。事实上,主机 = 192.168.1.22:3000,客户端 = 192.168.1.4
Note2,我通过
svelte-kit dev --host 0.0.0.0
运行程序
我没看到什么?有没有办法使用 Sveltekit 从网络提交中获取客户端用户的 IP 地址?
只是为了让人们知道... 现在可以了,使用
event.clientAddress
🎉
以下所有内容均用于生产/构建代码。
> npm run build
> node build
由于 VITE,在开发模式下运行应用程序会有所不同。
Svelte 适配器接收节点请求,其中还包括远程 IP。可以使用这里提到的方法提取IP。
然而,适配器仅将 SvelteIncomingRequest
接口所需的值转发到 Svelte Render。然后,Svelte 进一步将该接口扩展为
Request
接口,并包含以下值:
export interface Request<Locals = Record<string, any>, Body = unknown> {
url: URL;
method: string;
headers: RequestHeaders;
rawBody: RawBody;
params: Record<string, string>;
body: ParameterizedBody<Body>;
locals: Locals;
}
因此,我看到了四种可能的方法来解决这个问题:
IncomingRequest
界面以包含远程 IP。 (这还需要更新所有适配器)
handle
或
routes
中的任何位置获取远程 IP。不过,您可以记录 IP 或阻止某些路径。
['x-forwarded-for']
,如上面的界面所示,该标头在您的 Svelte Request 对象中可用。
IncomingRequest
接口和 Adapter Middleware。 (这很脏而且维护起来很混乱)
polka
设置它的示例 - 您当然也可以使用
express
或任何其他 HTTP 服务器。
/src/server.js
文件,在本例中是我们的中间件:
import polka from 'polka'
import { assetsMiddleware, prerenderedMiddleware, kitMiddleware } from '../build/middlewares.js'
const { PORT, DOMAIN } = process.env
polka()
.use((req, res, next) => {
console.log(req.socket.remoteAddress);
next()
})
// Load the SvelteKit build
.use(assetsMiddleware, prerenderedMiddleware, kitMiddleware)
.listen(PORT)
/svelte.config.js
将我们的中间件配置为
entryPoint
- 使用默认值
adapter-node
的最小示例:
import preprocess from 'svelte-preprocess';
import adapter from '@sveltejs/adapter-node';
/** @type {import('@sveltejs/kit').Config} */
const config = {
preprocess: preprocess(),
kit: {
adapter: adapter({ entryPoint: './src/server.js' }),
target: '#svelte'
}
};
export default config;
npm install @auth/sveltekit
hooks.server.ts
文件,如下所示:
import { SvelteKitAuth } from "@auth/sveltekit";
export let requestIp: string;
export const handle = async ({ event, resolve }) => {
requestIp = event.getClientAddress(); // IP from Client Request
console.log('IP Address from Client Request: ', requestIp);
// Return the requestIp along with the authentication result
const authResult: any = await SvelteKitAuth({
resolve,
})({ event, resolve });
return authResult;
};
export default handle;
requestIp
导入任何服务器端文件,例如
+page.server.ts
import { requestIp } from "../hooks.server";