无法在任何地方或节点使用 Javascript/Heroku CORS 调用 google oauth
Can't call google oauth with Javascript/Heroku CORS anywhere or Node
我需要使用 Google 的有限输入设备在屏幕上使用代码登录。
这对 Web 应用程序不可用,所以我必须使用其他类型,因此我无法设置 CORS,所以我使用 this.
在 Heroku 上设置了代理
这很好用:
curl https://xxxxx.herokuapp.com/https://accounts.google.com/o/oauth2/device/code -H "x-requested-with: *" -d "client_id=xxxxx.apps.googleusercontent.com&scope=profile"
这个returns和错误:invalid_request
var xhr = new XMLHttpRequest();
xhr.onload = function() {
console.log(this.responseText);
var data = JSON.parse(this.responseText);
console.log(data);
}
xhr.open("POST", 'https://xxxxxxx.herokuapp.com/https://accounts.google.com/o/oauth2/device/code', true);
xhr.setRequestHeader('x-requested-with', '*');
xhr.send(JSON.stringify({
client_id: 'xxxxxxxxxxxxxxxx.apps.googleusercontent.com',
scope: 'profile'
}));
这也是:
var querystring = require('querystring');
var request = require('request');
request({
uri: 'https://xxxx.herokuapp.com/https://accounts.google.com/o/oauth2/device/code',
body: querystring.stringify({
client_id: 'xxxxxx.apps.googleusercontent.com',
scope: 'profile'
}),
headers: {
'x-requested-with': '*'
},
method: 'POST'},
function (error, response, body) {
console.log(error)
console.log(response)
console.log(body)
}
);
我做错了什么?
将 XHR 请求的代码更改为:
var xhr = new XMLHttpRequest();
xhr.onload = function() {
console.log(this.responseText);
var data = JSON.parse(this.responseText);
console.log(data);
}
xhr.open("POST", 'https://xxxxxxx.herokuapp.com/https://accounts.google.com/o/oauth2/device/code', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send("client_id=xxxxx.apps.googleusercontent.com&scope=profile");
即发送一个Content-Type: application/x-www-form-urlencoded
请求header,一个请求body,格式为client_id=xxxxx.apps.googleusercontent.com&scope=profile
.
如果您想模拟问题中显示的 curl
请求,至少这是您必须做的——因为 curl
调用导致 [=15= 参数的字面值] 选项作为请求发送 body — client_id=xxxxx.apps.googleusercontent.com&scope=profile
— 带有 Content-Type: application/x-www-form-urlencoded
请求 header.
您可以通过将 --trace-ascii /dev/stdout
添加到 curl
调用并检查 curl
记录到控制台的跟踪来确认自己。
相比之下,问题 as-is 中 XHR 请求的代码以 {client_id: "xxxxxxxxxxxxxxxx.apps.googleusercontent.com", scope: "profile"}
格式发送请求 body 和 Content-Type: text/plain;charset=UTF-8
请求 header.
另请参阅相关 Google 文档的 “Request device and user codes” section,其中还显示需要 Content-Type: application/x-www-form-urlencoded
请求 header。
我需要使用 Google 的有限输入设备在屏幕上使用代码登录。 这对 Web 应用程序不可用,所以我必须使用其他类型,因此我无法设置 CORS,所以我使用 this.
在 Heroku 上设置了代理这很好用:
curl https://xxxxx.herokuapp.com/https://accounts.google.com/o/oauth2/device/code -H "x-requested-with: *" -d "client_id=xxxxx.apps.googleusercontent.com&scope=profile"
这个returns和错误:invalid_request
var xhr = new XMLHttpRequest();
xhr.onload = function() {
console.log(this.responseText);
var data = JSON.parse(this.responseText);
console.log(data);
}
xhr.open("POST", 'https://xxxxxxx.herokuapp.com/https://accounts.google.com/o/oauth2/device/code', true);
xhr.setRequestHeader('x-requested-with', '*');
xhr.send(JSON.stringify({
client_id: 'xxxxxxxxxxxxxxxx.apps.googleusercontent.com',
scope: 'profile'
}));
这也是:
var querystring = require('querystring');
var request = require('request');
request({
uri: 'https://xxxx.herokuapp.com/https://accounts.google.com/o/oauth2/device/code',
body: querystring.stringify({
client_id: 'xxxxxx.apps.googleusercontent.com',
scope: 'profile'
}),
headers: {
'x-requested-with': '*'
},
method: 'POST'},
function (error, response, body) {
console.log(error)
console.log(response)
console.log(body)
}
);
我做错了什么?
将 XHR 请求的代码更改为:
var xhr = new XMLHttpRequest();
xhr.onload = function() {
console.log(this.responseText);
var data = JSON.parse(this.responseText);
console.log(data);
}
xhr.open("POST", 'https://xxxxxxx.herokuapp.com/https://accounts.google.com/o/oauth2/device/code', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send("client_id=xxxxx.apps.googleusercontent.com&scope=profile");
即发送一个Content-Type: application/x-www-form-urlencoded
请求header,一个请求body,格式为client_id=xxxxx.apps.googleusercontent.com&scope=profile
.
如果您想模拟问题中显示的 curl
请求,至少这是您必须做的——因为 curl
调用导致 [=15= 参数的字面值] 选项作为请求发送 body — client_id=xxxxx.apps.googleusercontent.com&scope=profile
— 带有 Content-Type: application/x-www-form-urlencoded
请求 header.
您可以通过将 --trace-ascii /dev/stdout
添加到 curl
调用并检查 curl
记录到控制台的跟踪来确认自己。
相比之下,问题 as-is 中 XHR 请求的代码以 {client_id: "xxxxxxxxxxxxxxxx.apps.googleusercontent.com", scope: "profile"}
格式发送请求 body 和 Content-Type: text/plain;charset=UTF-8
请求 header.
另请参阅相关 Google 文档的 “Request device and user codes” section,其中还显示需要 Content-Type: application/x-www-form-urlencoded
请求 header。