NodeJS Post 带有请求承诺的 Twitch 身份验证请求
NodeJS Post Request with Request Promise for Twitch Authentication
我正在尝试通过 Twitch 登录对我的应用程序上的用户进行身份验证。我似乎无法 request.post()
正确(使用请求承诺)。我尝试了许多不同的变体,通常在服务器日志中得到 "Unhandled rejection"。 Twitch API 指南是 here。 POST 响应应为 JSON。这是我的最新版本:
const twitchATParams =
'?client_id=' + twitchAppClientId +
'&client_secret=' + twitchClientSecret +
'&code=' + code +
'&grant_type=authorization_code' +
'&redirect_uri=' + twitchAppRedirect;
request.post(twitchATRequestUrl + twitchATParams)
.then((accessTokenResponse) => {
const accessToken = accessTokenResponse.access_token;
console.log('Got an access token: ' + accessToken);
res.status(200).send('Got an access token: ' + accessToken);
})
.catch((error) => {
res.status(error.statusCode).send(error.error.error_description);
});
我也试过这个:
request.post({
url: twitchATRequestUrl,
form: { client_id: twitchAppClientId,
client_secret: twitchClientSecret,
code: code,
grant_type: "authorization_code",
redirect_uri: twitchAppRedirect}
}, function(error, accessTokenResponse, body){
const accessToken = accessTokenResponse.access_token;
console.log('Got an access token: ' + accessToken);
res.status(200).send('Got an access token: ' + accessToken);
});
这就是 Twitch API 指南所说的我需要做的,我想我在将其翻译成 JavaScript:
时遇到了问题
POST https://id.twitch.tv/oauth2/token
?client_id=<your client ID>
&client_secret=<your client secret>
&code=<authorization code received above>
&grant_type=authorization_code
&redirect_uri=<your registered redirect URI>
更新:
该应用程序使用 Cloud Functions 托管在 Firebase 上。也许这会影响我的请求?
更新 2:
据此: 我只能在 Firebase 付费计划上发出外部 API 请求。我假设这是我的问题。我将升级到现收现付计划(实际上免费提供大量数据),然后再试一次,post 我的结果在这里。
我不知道你用的是什么库,但是最后一个例子和这个版本非常相似:https://www.npmjs.com/package/request.
如果是那个版本,问题是你没有正确映射你的回调参数。 accessTokenResponse var 是响应对象,而不是您想要的 JSON。你必须像这样解析 body 参数。
function(error, response, body){
console.log(JSON.parse(body));
}
我认为你使用request-promise的方式是错误的。试试这个。
var rp = require('request-promise');
API 函数内部:
const twitchATParams =
'?client_id=' + twitchAppClientId +
'&client_secret=' + twitchClientSecret +
'&code=' + code +
'&grant_type=authorization_code' +
'&redirect_uri=' + twitchAppRedirect;
var options = {
method: 'POST',
uri: twitchATRequestUrl + twitchATParams,
/* qs: {
access_token: 'xxxxx xxxxx' // -> uri + '?access_token=xxxxx%20xxxxx'
}, */ //you can pass params here too
json: true // Automatically stringifies the body to JSON
};
rp(options)
.then(function (response) {
res.status(200).send('Got an access token: ' + response.accessToken);
})
.catch(function (err) {
// Post failed...
});
已解决。原来我确实需要一个付费计划(Blaze,随用随付)来访问外部 API。我升级了,基本上解决了这个问题。它让我看到了一个新的错误代码:StatusCodeError: 400 - "{\"status\":400,\"message\":\"Parameter redirect_uri does not match registered URI\"}
所以我发现我的代码中的重定向 url 缺少“/callback”(Twitch 应用管理设置中的 OAuth 重定向 URL这个“/回调”在最后)。
我也能够使用这两个代码块成功获取访问令牌:
const twitchTokenPayload = {
client_id: twitchAppClientId,
client_secret: twitchClientSecret,
code: code,
grant_type: 'authorization_code',
redirect_uri: twitchAppRedirect,
};
request.post(twitchATRequestUrl, { json: twitchTokenPayload })
.then((accessTokenResponse) => {
const accessToken = accessTokenResponse.access_token;
console.log('Got an access token: ' + accessToken);
res.status(200).send('Got an access token: ' + accessToken);
})
.catch((error) => {
console.log('Caught error: ' + error.error.error_description);
res.status(error.statusCode).send(error.error.error_description);
});
这也有效:
request.post({
url: twitchATRequestUrl,
form: { client_id: twitchAppClientId,
client_secret: twitchClientSecret,
code: code,
grant_type: "authorization_code",
redirect_uri: twitchAppRedirect}
}, function(error, response, body){
console.log(JSON.parse(body));
const jsonStuff = JSON.parse(body);
const accessToken = jsonStuff.access_token;
console.log('Got an access token: ' + accessToken);
res.status(200).send('Got an access token: ' + accessToken);
});
我正在尝试通过 Twitch 登录对我的应用程序上的用户进行身份验证。我似乎无法 request.post()
正确(使用请求承诺)。我尝试了许多不同的变体,通常在服务器日志中得到 "Unhandled rejection"。 Twitch API 指南是 here。 POST 响应应为 JSON。这是我的最新版本:
const twitchATParams =
'?client_id=' + twitchAppClientId +
'&client_secret=' + twitchClientSecret +
'&code=' + code +
'&grant_type=authorization_code' +
'&redirect_uri=' + twitchAppRedirect;
request.post(twitchATRequestUrl + twitchATParams)
.then((accessTokenResponse) => {
const accessToken = accessTokenResponse.access_token;
console.log('Got an access token: ' + accessToken);
res.status(200).send('Got an access token: ' + accessToken);
})
.catch((error) => {
res.status(error.statusCode).send(error.error.error_description);
});
我也试过这个:
request.post({
url: twitchATRequestUrl,
form: { client_id: twitchAppClientId,
client_secret: twitchClientSecret,
code: code,
grant_type: "authorization_code",
redirect_uri: twitchAppRedirect}
}, function(error, accessTokenResponse, body){
const accessToken = accessTokenResponse.access_token;
console.log('Got an access token: ' + accessToken);
res.status(200).send('Got an access token: ' + accessToken);
});
这就是 Twitch API 指南所说的我需要做的,我想我在将其翻译成 JavaScript:
时遇到了问题POST https://id.twitch.tv/oauth2/token
?client_id=<your client ID>
&client_secret=<your client secret>
&code=<authorization code received above>
&grant_type=authorization_code
&redirect_uri=<your registered redirect URI>
更新: 该应用程序使用 Cloud Functions 托管在 Firebase 上。也许这会影响我的请求?
更新 2:
据此:
我不知道你用的是什么库,但是最后一个例子和这个版本非常相似:https://www.npmjs.com/package/request.
如果是那个版本,问题是你没有正确映射你的回调参数。 accessTokenResponse var 是响应对象,而不是您想要的 JSON。你必须像这样解析 body 参数。
function(error, response, body){
console.log(JSON.parse(body));
}
我认为你使用request-promise的方式是错误的。试试这个。
var rp = require('request-promise');
API 函数内部:
const twitchATParams =
'?client_id=' + twitchAppClientId +
'&client_secret=' + twitchClientSecret +
'&code=' + code +
'&grant_type=authorization_code' +
'&redirect_uri=' + twitchAppRedirect;
var options = {
method: 'POST',
uri: twitchATRequestUrl + twitchATParams,
/* qs: {
access_token: 'xxxxx xxxxx' // -> uri + '?access_token=xxxxx%20xxxxx'
}, */ //you can pass params here too
json: true // Automatically stringifies the body to JSON
};
rp(options)
.then(function (response) {
res.status(200).send('Got an access token: ' + response.accessToken);
})
.catch(function (err) {
// Post failed...
});
已解决。原来我确实需要一个付费计划(Blaze,随用随付)来访问外部 API。我升级了,基本上解决了这个问题。它让我看到了一个新的错误代码:StatusCodeError: 400 - "{\"status\":400,\"message\":\"Parameter redirect_uri does not match registered URI\"}
所以我发现我的代码中的重定向 url 缺少“/callback”(Twitch 应用管理设置中的 OAuth 重定向 URL这个“/回调”在最后)。
我也能够使用这两个代码块成功获取访问令牌:
const twitchTokenPayload = {
client_id: twitchAppClientId,
client_secret: twitchClientSecret,
code: code,
grant_type: 'authorization_code',
redirect_uri: twitchAppRedirect,
};
request.post(twitchATRequestUrl, { json: twitchTokenPayload })
.then((accessTokenResponse) => {
const accessToken = accessTokenResponse.access_token;
console.log('Got an access token: ' + accessToken);
res.status(200).send('Got an access token: ' + accessToken);
})
.catch((error) => {
console.log('Caught error: ' + error.error.error_description);
res.status(error.statusCode).send(error.error.error_description);
});
这也有效:
request.post({
url: twitchATRequestUrl,
form: { client_id: twitchAppClientId,
client_secret: twitchClientSecret,
code: code,
grant_type: "authorization_code",
redirect_uri: twitchAppRedirect}
}, function(error, response, body){
console.log(JSON.parse(body));
const jsonStuff = JSON.parse(body);
const accessToken = jsonStuff.access_token;
console.log('Got an access token: ' + accessToken);
res.status(200).send('Got an access token: ' + accessToken);
});