我可以在 SvelteKit 项目中获取用户的 IP 地址吗?

问题描述 投票:0回答:4

我有兴趣捕获用户首次提交到我的网站时的互联网协议 (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 地址?

node.js httpresponse svelte httpwebresponse sveltekit
4个回答
4
投票

只是为了让人们知道... 现在可以了,使用

event.clientAddress
🎉


3
投票

以下所有内容均用于生产/构建代码。

> npm run build
> node build

由于 VITE,在开发模式下运行应用程序会有所不同。


Svelte 适配器接收节点请求,其中还包括远程 IP。可以使用这里提到的方法提取IP。

然而,适配器仅将 Svelte

IncomingRequest

 接口所需的值转发到 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; }
因此,我看到了四种可能的方法来解决这个问题:

    创建一个问题来更新 Svelte
  1. IncomingRequest
     界面以包含远程 IP。 (这还需要更新所有适配器)
  2. 创建您自己的中间件作为应用程序的入口点。缺点是,您仍然无法在 Svelte
  3. handle
    routes
     中的任何位置获取远程 IP。不过,您可以记录 IP 或阻止某些路径。
  4. 在代理后面运行您的应用程序,代理将在请求标头中填充
  5. ['x-forwarded-for']
    ,如上面的界面所示,该标头在您的 Svelte Request 对象中可用。
  6. 自行修改 Svelte
  7. IncomingRequest
     接口和 Adapter Middleware。 (这很脏而且维护起来很混乱)
由于 2. 是最适用的方式,这里是如何使用

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;
    

1
投票
Sveltekit 中有一张票证可能会解决此功能,希望很快

https://github.com/sveltejs/kit/pull/3993


0
投票
这是我采取的步骤。

  1. npm install @auth/sveltekit
    
    
  2. 在 src 文件夹中,创建一个

    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;
    
    
  3. requestIp

     导入任何服务器端文件,例如 
    +page.server.ts
    
    

    import { requestIp } from "../hooks.server";
    
    
© www.soinside.com 2019 - 2024. All rights reserved.