使用Express / NodeJS后端时 - 我有一个REST GETTER用于使用strava进行身份验证(passport-strava)
当我直接调用API URL(http://localhost:3000/api/auth/strava)时 - 连接成功,我可以检索配置文件信息。 但是,当通过浏览器小部件调用它时,即onClick一个HTML按钮并路由到后端 - 我发出错误
XMLHttpRequest cannot load https://www.strava.com/oauth/authorize?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fstrava%2Fcallback&client_id=9769. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access.
我确实理解这与CORS有关,标题是" Access-Control-Allow-Origin"但是,必须包含在将标题添加到具有适当值的标题中时没有喘息的机会。
我试图使用chrome:// net-internals来拦截调用,以检查是否正在删除Access-Control-Allow-Origin并注意到调用中的变化 -
直接通过API调用时 - 调用如下
1097271 URL_REQUEST http://localhost:3000/api/auth/strava
1097273 DISK_CACHE_ENTRY http://localhost:3000/api/auth/strava
1097275 HTTP_STREAM_JOB https://www.strava.com/
1097276 CONNECT_JOB ssl/www.strava.com:443
1097277 CONNECT_JOB ssl/www.strava.com:443
1097278 SOCKET ssl/www.strava.com:443
1097279 CONNECT_JOB ssl/www.strava.com:443
1097280 CONNECT_JOB ssl/www.strava.com:443
1097281 SOCKET ssl/www.strava.com:443
1097282 DISK_CACHE_ENTRY https://www.strava.com/oauth/authorize?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fstrava%2Fcallback&client_id=9769
1097283 HTTP_STREAM_JOB https://www.strava.com/
1097285 URL_REQUEST http://localhost:3000/api/auth/strava
1097288 DISK_CACHE_ENTRY http://localhost:3000/api/auth/strava
1097290 HTTP_STREAM_JOB https://www.strava.com/
1097291 DISK_CACHE_ENTRY https://www.strava.com/oauth/authorize?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fstrava%2Fcallback&client_id=9769
1097292 HTTP_STREAM_JOB https://www.strava.com/
1097293 DISK_CACHE_ENTRY http://localhost:3000/api/auth/strava/callback?state=&code=7b5722c72f079ee2ac5dfeb7d5140cdc6375f5cc
但是,当通过窗口小部件路由时,调用如下
1097337 URL_REQUEST http://localhost:3000/api/auth/strava
1097339 DISK_CACHE_ENTRY http://localhost:3000/api/auth/strava
1097344 URL_REQUEST https://www.strava.com/oauth/authorize?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fstrava%2Fcallback&client_id=9769
1097346 DISK_CACHE_ENTRY https://www.strava.com/oauth/authorize?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fstrava%2Fcallback&client_id=9769
1097347 HTTP_STREAM_JOB https://www.strava.com/
1097348 CONNECT_JOB pm/ssl/www.strava.com:443
1097349 CONNECT_JOB pm/ssl/www.strava.com:443
1097350 HOST_RESOLVER_IMPL_JOB www.strava.com
1097352 SOCKET pm/ssl/www.strava.com:443
1097353 CONNECT_JOB pm/ssl/www.strava.com:443
1097354 SOCKET pm/ssl/www.strava.com:443
我似乎提出的差异是额外的电话
1097344 URL_REQUEST https://www.strava.com/oauth/authorize?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fstrava%2Fcallback&client_id=9769
在上一个场景中没有做过。
这些观察结果不仅适用于passport-strava套餐,也适用于passport-facebook套餐。因此,我认为我进入这种状态会有一些严重错误。
非常感谢任何帮助。
答案 0 :(得分:1)
由于您已经了解CORS,因此我会详细介绍。
基本上您的问题在于REST server
,它需要使用适当的内容设置响应数据包的标头,以便浏览器不会抱怨。不幸的是,这是一个安全功能。
因此,在您的服务器代码中,您需要定义一个能够执行上述操作的函数,并将其设置为表达的中间件层中的1个,当HTTP通过时必须解析。
示例强>:
var express = require('express');
var app = express();
var httpAccessControlPolicy = function(req, res, next) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-type,Accept,X-Access-Token,X-Key,Authorization');
res.setHeader('Access-Control-Allow-Credentials', false);
next();
};
app.use(httpAccessControlPolicy);
是。正如评论者中的一位所指出的那样,npm模块cors
也可以完成这项任务。
CORS :https://www.npmjs.com/package/cors
如果您打算使用它,那么您可能正在查看此示例用法:
var express = require('express')
, cors = require('cors')
, app = express();
app.use(cors());
app.get('/products/:id', function(req, res, next){
res.json({msg: 'This is CORS-enabled for all origins!'});
});
app.listen(80, function(){
console.log('CORS-enabled web server listening on port 80');
});