Вместо местоположения пользователя отправляется местоположение сервера

#ruby-on-rails #reactjs #fetch #next.js

#ruby-on-rails #reactjs #выборка #next.js

Вопрос:

У меня есть следующий стек:

  • Rails API (серверная часть)
  • Next.js (интерфейс)

В моем Rails API я отслеживаю, откуда поступает запрос, например ip , user_agent , city , country , latitude , и longitude .

Но проблема в том, что вместо пользовательских данных отправляются данные сервера.

В моем Next.js приложение, которое я использую https://nextjs.org/docs/api-routes/introduction , поскольку access_token для API хранится в сеансе. И я не хочу предоставлять его клиенту.

Таким образом, процесс будет заключаться в том, что из React я отправлю запрос POST /api/process/ в Next.js Конечная точка API. Затем /api/process я возьму access_token из сеанса и отправлю запрос в Rails API.

Поскольку Next.js Конечная точка API — это та, которая отправила запрос в Rails API. Мой Rails API хранит местоположение интерфейсного сервера вместо фактической информации о пользователе.

Псевдокод:

В интерфейсе React:

 fetch('/api/process', {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ some: 'data' })
})
  

В pages/api/process.js :

 export default function handler(req, res) {
  fetch(RAILS_API_ENDPOINT, {
    method: 'POST',
    headers: {
      Accept: 'application/json',
      'Content-Type': 'application/json',
      Authorization: `Bearer ${req.session.token}` // attach token here
    },
    body: req.body
  })
}
  

Есть ли какой-либо обходной путь для этого? Кажется, я не хочу предоставлять access_token доступ к клиенту и отправлять запрос напрямую в Rails API.

Ответ №1:

Вы настроили прокси-API, в результате сервер Rails ничего не знает о клиенте FE, потому что между ними есть промежуточный уровень. Итак, есть 2 варианта:

  1. Настройте клиент FE для прямого вызова rails (что, как вы сказали, вы не хотите делать).
  2. Отправьте эту информацию о клиенте FE как часть заголовков или в полезной нагрузке в rails API. Оттуда Rails API может делать с этими данными все, что захочет.