Проблема аутентификации OAuth с API ImmoScout – “Недостаточные учетные данные потребителя OAuth”

Вопрос или проблема

Вопрос:
Привет всем, я пытаюсь интегрироваться с API ImmoScout, используя OAuth 1.0a, но у меня возникла проблема. Моя текущая конфигурация использует express, axios и пакет oauth-1.0a.

Проблема:
Когда я пытаюсь получить токен запроса или токен доступа, я получаю следующий ответ с ошибкой:

<common:messages xmlns:common="http://rest.immobilienscout24.de/schema/common/1.0">
    <message>
        <messageCode>ERROR_BAD_REQUEST</messageCode>
        <message>Недостаточные учетные данные клиента OAuth.</message>
    </message>
</common:messages>

Мой код:
Ниже приведен код, который я использую для аутентификации и вызовов API:

const express = require('express');
const bodyParser = require('body-parser');
const OAuth = require('oauth-1.0a');
const axios = require('axios');
const crypto = require('crypto');

const app = express();
app.use(bodyParser.urlencoded({ extended: true }));

const SANDBOX_URL = "https://rest.sandbox-immobilienscout24.de";
const REQUEST_TOKEN_URL = `${SANDBOX_URL}/restapi/security/oauth/request_token`;
const ACCESS_TOKEN_URL = `${SANDBOX_URL}/restapi/security/oauth/access_token`;
const ACCESS_CONFIRMATION_URL = `${SANDBOX_URL}/restapi/security/oauth/confirm_access`;
const RESOURCE_ENDPOINT_URL = `${SANDBOX_URL}/restapi/api/offer/v1.0/user/me/realestate/`;

const CLIENT_KEY = '';
const CLIENT_SECRET = '';

let requestTokenRepository = {};
let accessTokenRepository = {};

const oauth = OAuth({
    consumer: { key: CLIENT_KEY, secret: CLIENT_SECRET },
    signature_method: 'HMAC-SHA1',
    hash_function(baseString, key) {
        return crypto.createHmac('sha1', key).update(baseString).digest('base64');
    },
});

// Инициализация обмена токенами
app.get('/initialize-token-exchange', async (req, res) => {
    const callbackUrl = `http://localhost:${process.env.PORT || 3000}/callback`;

    const requestTokenParams = {
        url: REQUEST_TOKEN_URL,
        method: 'POST',
        data: { oauth_callback: callbackUrl },
    };

    try {
        const requestTokenResponse = await axios(requestTokenParams);
        const requestToken = requestTokenResponse.data;
        const userName = req.user.name;

        requestTokenRepository[userName] = requestToken;
        res.redirect(`${ACCESS_CONFIRMATION_URL}?oauth_token=${requestToken.oauth_token}`);
    } catch (error) {
        console.error(error);
        res.status(500).send('Ошибка при получении токена запроса');
    }
});

// Обработка обратного вызова OAuth
app.get('/callback', async (req, res) => {
    const { state, oauth_token, oauth_verifier } = req.query;
    const userName = req.user.name;

    if (state !== 'authorized') return res.status(401).send('Авторизация была отклонена.');

    const latestRequestToken = requestTokenRepository[userName];

    if (!latestRequestToken || latestRequestToken.oauth_token !== oauth_token) {
        return res.status(400).send('Неверный токен запроса.');
    }

    try {
        const accessTokenParams = {
            url: ACCESS_TOKEN_URL,
            method: 'POST',
            data: { oauth_verifier },
            headers: oauth.toHeader(oauth.authorize(requestTokenParams, latestRequestToken)),
        };

        const accessTokenResponse = await axios(accessTokenParams);
        accessTokenRepository[userName] = accessTokenResponse.data;

        res.redirect('/load-real-estates');
    } catch (error) {
        console.error(error);
        res.status(500).send('Ошибка при обмене на токен доступа');
    }
});

// Загрузка недвижимости
app.get('/load-real-estates', async (req, res) => {
    const userName = req.user.name;
    const accessToken = accessTokenRepository[userName];

    if (!accessToken) return res.redirect('/initialize-token-exchange');

    try {
        const resourceParams = {
            url: RESOURCE_ENDPOINT_URL,
            method: 'GET',
            headers: oauth.toHeader(oauth.authorize(resourceParams, accessToken)),
        };

        const realEstatesResponse = await axios(resourceParams);
        res.send(realEstatesResponse.data);
    } catch (error) {
        console.error(error);
        res.status(500).send('Ошибка при загрузке недвижимости');
    }
});

// Запуск сервера
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Сервер работает на http://localhost:${PORT}`);
});

Вопросы:

  1. Есть ли что-то неправильное в моей реализации OAuth или в том, как я подписываю запросы?
  2. Может ли эта проблема быть связана с неверными правами доступа, разрешениями или конфигурацией API?
  3. Есть ли конкретные заголовки или дополнительные параметры, которых мне может не хватать?

Буду признателен за любую помощь или советы по решению этой проблемы! Заранее спасибо.

Что я пробовал:

  1. Дважды проверил CLIENT_KEY и CLIENT_SECRET, чтобы убедиться, что они правильные.
  2. Использовал как песочницу, так и производственные URL-адреса.
  3. Убедился, что URL-адрес обратного вызова правильно установлен на http://localhost:3000/callback.
  4. Проверил свою логику токена запроса, но я все еще получаю ошибку “Недостаточные учетные данные клиента OAuth”.

Ответ или решение

Проблема с Аутентификацией OAuth при интеграции с API ImmoScout: "Недостаточные учетные данные потребителя OAuth"

Ваша проблема с интеграцией API ImmoScout через OAuth 1.0a и сообщение об ошибке "Недостаточные учетные данные потребителя OAuth" требуют внимания к нескольким ключевым аспектам. Давайте рассмотрим, как вы можете решить эту проблему, принимая во внимание вашу текущую реализацию кода.

1. Проверка учетных данных клиента

Первым делом убедитесь, что следующие элементы корректны:

  • CLIENT_KEY и CLIENT_SECRET: Пожалуйста, убедитесь, что эти значения правильно скопированы из вашего приложения в консоли ImmoScout. Проверьте их наличие на предмет возможных лишних пробелов или неверных символов.

  • URL запросов: Убедитесь, что вы используете правильные конечные точки API (особенно для песочницы и продакшн-версии). Ваш код ссылается на SANDBOX_URL, который должен быть подготовлен и активирован для вашего приложения.

2. Реализация OAuth

Ваш текущий код использует библиотеку oauth-1.0a для генерации заголовков OAuth. Важно удостовериться, что вы корректно генерируете все необходимые заголовки при запросах:

  • Для получения токенов (как request, так и access token) необходимо удостовериться, что запросы содержат корректные заголовки. Проверьте ваш метод oauth.authorize() — он должен принимать правильные параметры запроса.

  • Как вариант, для отладки, вы можете добавить логирование закодированного запроса для дальнейшего анализа и сопоставления с теми данными, которые ожидает сервер, чтобы убедиться, что они соответствуют стандарту.

3. Обработка параметров и заголовков

  • Параметры запроса: Убедитесь, что вы правильно указываете все необходимые параметры в теле и заголовках ваших запросов (например, oauth_callback при запросе токена).

  • Заголовки: Представляемые заголовки должны соответствовать спецификациям OAuth 1.0a, включая правильное использование Authorization заголовка во всех запросах.

headers: {
    ...oauth.toHeader(oauth.authorize(requestTokenParams, latestRequestToken)),
    'Content-Type': 'application/x-www-form-urlencoded', // Убедитесь, что заголовок присутствует
}

4. Может ли это быть связано с правами доступа или конфигурацией API?

Действительно, ваша проблема может оказаться связанной с недостатком прав на доступ:

  • Проверьте настройки вашего приложения в консоли разработчика ImmoScout на предмет недостающих разрешений или неправильной конфигурации OAuth.

  • Если API поддерживает использование различных скоупов, убедитесь, что вы запрашиваете правильные скоупы, что может быть критично в процессе получения токена.

5. Безопасность и дополнения

  • Убедитесь, что ваши соединения защищены (например, используйте https, если это поддерживается API).

  • Рассмотрите возможность использовать библиотеки для OAuth 1.0a, которые более активно поддерживаются и имеют хорошую документацию (например, passport-oauth или oauth). Это может упростить процессы аутентификации и избавить вас от ошибок.

Заключение

Предлагаю еще раз пройтись по всем аспектам реализации OAuth и провести тщательную проверку на наличие ошибок и недочетов. Используя предложенные рекомендации, вы сможете значительно повысить шансы на успешную интеграцию с API ImmoScout. Если ваша проблема все еще не решена, рассмотрите возможность обращения в службу поддержки ImmoScout для получения более специфической информации о ваших учетных данных и настройках API.

Оцените материал
Добавить комментарий

Капча загружается...