我似乎无法通过Nest API获取访问令牌。 我尝试以3种不同的方式POST访问访问令牌URL,但它们都给出了相同的结果。
我正在使用以下代码:
<body>
<button type = 'button' id = 'connect' class = 'btn btn-default'>Connect To Nest</button>
<div id = 'pinArea'>
<label for = 'pin'>Enter PIN Here: </label><input type = 'text' name = 'pin' id = 'pin'><br />
<button type = 'button' class = 'btn btn-default' id = 'pinSubmit'>Submit</button>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script type = 'text/javascript'>
$(document).ready(function() {
function makeid()
{
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for( var i=0; i < 5; i++ )
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
$("#connect").click(function() {
var state = makeid();
window.open('https://home.nest.com/login/oauth2?client_id=MYCLIENTID&state='+state+'');
$("#connect").hide();
$("#pinArea").show();
});
$("#pinSubmit").click(function() {
var pin = $("#pin").val();
$.ajax({
url: "https://api.home.nest.com/oauth2/access_token?code="+pin+"&client_id=MYCLIENTID&client_secret=MYCIENTSECRET&grant_type=authorization_code",
//data: {code: pin, client_id: "MYCLIENTID", client_secret: "MMYCLIENTSECRET", grant_type: "authorization_code"},
type: "POST",
success: function(res) {
console.log(res);
},
error: function(e) {
console.log(e);
}
});
});
});
</script>
问题是,当我的控制台发送回我的访问令牌时,URL在我的控制台中出现以下错误:
XMLHttpRequest cannot load https://api.home.nest.com/oauth2/access_token. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://fatslug.ca' is therefore not allowed access.
关于可能导致这种情况的任何想法?我只是完全错了吗?!
答案 0 :(得分:4)
问题是Nest不支持COR进行令牌交换步骤。我认为这是故意的,但我真的不确定。
相反,Nest似乎更喜欢您构建服务器并通过该服务器代理令牌交换。很简单。
但是,如果你真的想在浏览器中进行令牌交换(并且不要为生产中的任何事情做这件事或认真对待隐私/安全性),那么你可以使用像cors-anywhere.com这样的服务:
"https://cors-anywhere.herokuapp.com/api.home.nest.com/oauth2/access_token?" +
"code="+auth.authorizationCode+"&" +
"client_id="+clientId+"&" +
"client_secret="+clientSecret+"&" +
"grant_type=authorization_code"
这将把请求发送到cors-anywhere,这将为请求提供CORs支持,并为Nest提供代理。
答案 1 :(得分:0)
我不认为它与CORS有任何关系,因为Nest需要POST。