При выполнении моего запроса на сообщение, как показано ниже, я получаю ошибку состояния 401 от конечной точки/oauth/request_token . Я на первом шаге в 3 -этажном процессе для аутентификации с https://api.x.com, чтобы включить кнопку «Войти с X».
import crypto from 'crypto';
import axios from 'axios';
import { NextResponse } from 'next/server';
const X_CLIENT_ID = process.env.X_CLIENT_ID as string;
const X_CLIENT_SECRET = process.env.X_CLIENT_SECRET as string;
const X_CALLBACK_URL = process.env.X_CALLBACK_URL as string;
if (!X_CLIENT_ID || !X_CLIENT_SECRET || !X_CALLBACK_URL) {
throw 'Missing env vars';
}
const BASE_URL = 'https://api.x.com/oauth/request_token';
export async function GET() {
try {
const params = createSignedRequestParams();
const authorizationHeader = `Oauth oauth_callback="${params.oauth_callback}",oauth_consumer_key="${params.oauth_consumer_key}",oauth_nonce="${params.oauth_nonce}",oauth_signature="${params.oauth_signature}",oauth_signature_method="${params.oauth_signature_method}",oauth_timestamp="${params.oauth_timestamp}",oauth_version="${params.oauth_version}"`
const response = await axios.post(BASE_URL, null, {
headers: {
'User-Agent': 'Cutcosts',
'Host': 'api.x.com',
'Accept': '*/*',
'Authorization': authorizationHeader
}
});
console.log(response);
return NextResponse.json({ success: true })
} catch (error: any) {
console.log(JSON.stringify(error, null, 2));
return NextResponse.json({ message: 'Internal server error' }, { status: 500 });
}
}
function enc(str: string) {
return encodeURIComponent(str);
}
function createSignedRequestParams() {
// RFC 5849 Section 3.4.1
// Encoding method is only necessary for custom methods
const method = 'POST';
// Params
const params: Record = {
'oauth_callback': X_CALLBACK_URL,
'oauth_consumer_key': X_CLIENT_ID, // "API Key" in X Developer Portal, per https://docs.x.com/resources/fundamenta ... he-process
'oauth_nonce': Math.random().toString(36).substring(2) + Math.random().toString(36).substring(2),
'oauth_signature_method': 'HMAC-SHA1',
'oauth_timestamp': String(Math.floor(Date.now() / 1000)),
'oauth_version': '1.0'
};
// Encode params
const encodedParams: Record = {};
Object.keys(params).forEach((key) => {
encodedParams[key] = enc(params[key]);
});
// Normalize encoded params
const normalizedParams = Object.keys(encodedParams).sort().map(key => `${key}=${encodedParams[key]}`).join('&');
// The example in RFC 5849 Section 3.4.1.1 shows one ampersand after POST, and one after base URL
// the rest of the ampersands and equal signs in params are encoded
// Encode normalize params
const encodedNormalizedParams = normalizedParams; // enc(normalizedParams);
// Encode base url
const encodedBaseUrl = enc(BASE_URL);
// Construct base string
// https://docs.x.com/resources/fundamenta ... ase-string
const baseString = method + '&' + encodedBaseUrl + '&' + enc(encodedNormalizedParams);
console.log('Example:', 'POST&https%3A%2F%2Fapi.x.com%2F1.1%2Fstatuses%2Fupdate.json&include\_entities%3Dtrue%26oauth\_consumer\_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth\_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth\_signature\_method%3DHMAC-SHA1%26oauth\_timestamp%3D1318622958%26oauth\_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521');
console.log('Actual:', baseString);
// Construct encoded signature
// X_CLIENT_SECRET is "API Secret" in X Developer Portal, per https://docs.x.com/resources/fundamenta ... he-process
const signingKey = enc(X_CLIENT_SECRET) + '&';
const signature = crypto.createHmac('sha1', signingKey)
.update(baseString)
.digest('base64');
const encodedSignature = enc(signature);
// Update params to include encoded signature
encodedParams.oauth_signature = encodedSignature;
return encodedParams;
}
< /code>
Попытки устранения неисправностей: < /p>
Пробое кодировать всю строку после «Oauth» в заголовке авторизации. (Статус 400) < /p>
Пробовал не кодировать подпись после того, как она находится в Base64 (Status 400) < /p>
Попробовал параметр OAuth_callback в корпус, а не Заголовок авторизации (статус 401) < /p>
Пробовал не кодировать нормализованные параметры во время создания подписи (статус 401) < /p>
проверил, что вызов URI в портале разработчика X соответствует совпадам URI обратного вызова в запросе post < /p>
подтвердил, что значение oauth_consumer_key соответствует значению идентификатора клиента с портала разработчика X разработчика < /p>
подтвердило это значение, используемое в процессе подписи Post, соответствует клиенту клиента Секрет из X Developer Portal < /p>
Пробовал использование «ключа API» и «секрет API» для oauth_consumer_key и подписать секрет вместо идентификатора клиента и секрета клиента (извлеченные из документов [dot] x [dot] com/resources/fundamentals/outentication/oauth-1-0a/ueping-user-access-tokens#Обзор процесса, который на самом деле является правильным для потока OAuth 1.0a, однако я все еще получаю статус 401)
Что еще я могу устранения устранения? (CreateHmac, обновление, дайджест)
Подробнее здесь: https://stackoverflow.com/questions/794 ... -1-0a-flow
Как подписать HTTP -запрос на https: //api.x.com's oauth 1.0a поток? ⇐ Javascript
Форум по Javascript
1738887012
Anonymous
При выполнении моего запроса на сообщение, как показано ниже, я получаю ошибку состояния 401 от конечной точки/oauth/request_token . Я на первом шаге в 3 -этажном процессе для аутентификации с https://api.x.com, чтобы включить кнопку «Войти с X».
import crypto from 'crypto';
import axios from 'axios';
import { NextResponse } from 'next/server';
const X_CLIENT_ID = process.env.X_CLIENT_ID as string;
const X_CLIENT_SECRET = process.env.X_CLIENT_SECRET as string;
const X_CALLBACK_URL = process.env.X_CALLBACK_URL as string;
if (!X_CLIENT_ID || !X_CLIENT_SECRET || !X_CALLBACK_URL) {
throw 'Missing env vars';
}
const BASE_URL = 'https://api.x.com/oauth/request_token';
export async function GET() {
try {
const params = createSignedRequestParams();
const authorizationHeader = `Oauth oauth_callback="${params.oauth_callback}",oauth_consumer_key="${params.oauth_consumer_key}",oauth_nonce="${params.oauth_nonce}",oauth_signature="${params.oauth_signature}",oauth_signature_method="${params.oauth_signature_method}",oauth_timestamp="${params.oauth_timestamp}",oauth_version="${params.oauth_version}"`
const response = await axios.post(BASE_URL, null, {
headers: {
'User-Agent': 'Cutcosts',
'Host': 'api.x.com',
'Accept': '*/*',
'Authorization': authorizationHeader
}
});
console.log(response);
return NextResponse.json({ success: true })
} catch (error: any) {
console.log(JSON.stringify(error, null, 2));
return NextResponse.json({ message: 'Internal server error' }, { status: 500 });
}
}
function enc(str: string) {
return encodeURIComponent(str);
}
function createSignedRequestParams() {
// RFC 5849 Section 3.4.1
// Encoding method is only necessary for custom methods
const method = 'POST';
// Params
const params: Record = {
'oauth_callback': X_CALLBACK_URL,
'oauth_consumer_key': X_CLIENT_ID, // "API Key" in X Developer Portal, per https://docs.x.com/resources/fundamentals/authentication/oauth-1-0a/obtaining-user-access-tokens#overview-of-the-process
'oauth_nonce': Math.random().toString(36).substring(2) + Math.random().toString(36).substring(2),
'oauth_signature_method': 'HMAC-SHA1',
'oauth_timestamp': String(Math.floor(Date.now() / 1000)),
'oauth_version': '1.0'
};
// Encode params
const encodedParams: Record = {};
Object.keys(params).forEach((key) => {
encodedParams[key] = enc(params[key]);
});
// Normalize encoded params
const normalizedParams = Object.keys(encodedParams).sort().map(key => `${key}=${encodedParams[key]}`).join('&');
// The example in RFC 5849 Section 3.4.1.1 shows one ampersand after POST, and one after base URL
// the rest of the ampersands and equal signs in params are encoded
// Encode normalize params
const encodedNormalizedParams = normalizedParams; // enc(normalizedParams);
// Encode base url
const encodedBaseUrl = enc(BASE_URL);
// Construct base string
// https://docs.x.com/resources/fundamentals/authentication/oauth-1-0a/creating-a-signature#creating-the-signature-base-string
const baseString = method + '&' + encodedBaseUrl + '&' + enc(encodedNormalizedParams);
console.log('Example:', 'POST&https%3A%2F%2Fapi.x.com%2F1.1%2Fstatuses%2Fupdate.json&include\_entities%3Dtrue%26oauth\_consumer\_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth\_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth\_signature\_method%3DHMAC-SHA1%26oauth\_timestamp%3D1318622958%26oauth\_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521');
console.log('Actual:', baseString);
// Construct encoded signature
// X_CLIENT_SECRET is "API Secret" in X Developer Portal, per https://docs.x.com/resources/fundamentals/authentication/oauth-1-0a/obtaining-user-access-tokens#overview-of-the-process
const signingKey = enc(X_CLIENT_SECRET) + '&';
const signature = crypto.createHmac('sha1', signingKey)
.update(baseString)
.digest('base64');
const encodedSignature = enc(signature);
// Update params to include encoded signature
encodedParams.oauth_signature = encodedSignature;
return encodedParams;
}
< /code>
Попытки устранения неисправностей: < /p>
Пробое кодировать всю строку после «Oauth» в заголовке авторизации. (Статус 400) < /p>
Пробовал не кодировать подпись после того, как она находится в Base64 (Status 400) < /p>
Попробовал параметр OAuth_callback в корпус, а не Заголовок авторизации (статус 401) < /p>
Пробовал не кодировать нормализованные параметры во время создания подписи (статус 401) < /p>
проверил, что вызов URI в портале разработчика X соответствует совпадам URI обратного вызова в запросе post < /p>
подтвердил, что значение oauth_consumer_key соответствует значению идентификатора клиента с портала разработчика X разработчика < /p>
подтвердило это значение, используемое в процессе подписи Post, соответствует клиенту клиента Секрет из X Developer Portal < /p>
Пробовал использование «ключа API» и «секрет API» для oauth_consumer_key и подписать секрет вместо идентификатора клиента и секрета клиента (извлеченные из документов [dot] x [dot] com/resources/fundamentals/outentication/oauth-1-0a/ueping-user-access-tokens#Обзор процесса, который на самом деле является правильным для потока OAuth 1.0a, однако я все еще получаю статус 401)
Что еще я могу устранения устранения? (CreateHmac, обновление, дайджест)
Подробнее здесь: [url]https://stackoverflow.com/questions/79419688/how-do-i-sign-an-http-request-for-https-api-x-coms-oauth-1-0a-flow[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия