当我尝试使用angular.js的$ http模块授权推特应用时,我总是得到:
XMLHttpRequest cannot load https://api.twitter.com/oauth/authenticate?oauth_token=something. Origin null is not allowed by Access-Control-Allow-Origin.
客户代码:
$http({
method: 'GET',
headers: { "Content-Type": undefined },
url: '/oauth/twitter'
});
服务器代码:
app.configure(function () {
app.use(express.cookieParser());
app.use(express.cookieSession({ secret: 'tobo!', cookie: { maxAge: 3600 }}));
app.use(express.session({secret: 'secret'}));
app.use(passport.initialize());
app.use(passport.session());
});
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Credentials", true);
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header("Access-Control-Allow-Headers",
'Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept');
next();
});
app.get('/oauth/twitter', passport.authenticate('twitter'), function (req, res) {
// The request will be redirected to Twitter for authentication, so this
// function will not be called.
console.log('ouath/twitter')
});
app.get('/oauth/twitter/callback', passport.authenticate('twitter', { successRedirect: '/', failureRedirect: '/login' }));
但如果我使用带有oauth / twitter地址的超链接,它就可以了。我不知道是什么问题。大多数人说不允许来源,但'*'应该允许每个地址连接到服务器。
答案 0 :(得分:3)
我有同样的问题,我找到的唯一解决方案是使用超链接(正如你在帖子中所说)。我认为你不能出于安全原因使用ajax请求。但是,使用超链接为我工作,我可以授权我的用户。
为什么不使用超链接?有问题吗?
答案 1 :(得分:1)
您不能使用导致重定向到Twitter的AJAX请求,因为使用Twitter进行身份验证意味着实际的用户交互,用户必须登录到他们的Twitter帐户并授予您的应用访问他们(部分)的权限帐户。
您要么必须将浏览器的位置更改为/oauth/twitter
,要么使用该URL创建一个新窗口(并在完成身份验证时发回主窗口信号)。
答案 2 :(得分:0)
只需在客户端代码中调用您的超链接即可。
window.location.href =''