- Вопрос или проблема
- Ответ или решение
- Проблема с Аутентификацией OAuth при интеграции с API ImmoScout: "Недостаточные учетные данные потребителя OAuth"
- 1. Проверка учетных данных клиента
- 2. Реализация OAuth
- 3. Обработка параметров и заголовков
- 4. Может ли это быть связано с правами доступа или конфигурацией API?
- 5. Безопасность и дополнения
- Заключение
Вопрос или проблема
Вопрос:
Привет всем, я пытаюсь интегрироваться с 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}`);
});
Вопросы:
- Есть ли что-то неправильное в моей реализации OAuth или в том, как я подписываю запросы?
- Может ли эта проблема быть связана с неверными правами доступа, разрешениями или конфигурацией API?
- Есть ли конкретные заголовки или дополнительные параметры, которых мне может не хватать?
Буду признателен за любую помощь или советы по решению этой проблемы! Заранее спасибо.
Что я пробовал:
- Дважды проверил
CLIENT_KEY
иCLIENT_SECRET
, чтобы убедиться, что они правильные. - Использовал как песочницу, так и производственные URL-адреса.
- Убедился, что URL-адрес обратного вызова правильно установлен на
http://localhost:3000/callback
. - Проверил свою логику токена запроса, но я все еще получаю ошибку “Недостаточные учетные данные клиента 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.