我正在嘗試將ExpressJS + PassportJS與Angular SPA應用程序結合使用。這個問題可能在CORS頭文件中。將AngularJS與PassportJS結合使用時出現CORS問題
這裏就是我試圖完成:
客戶端查看:
<a class="btn btn-block btn-social btn-twitter" ng-click="twitter()">
<i class="fa fa-twitter"></i> Sign in with Twitter
</a>
客戶機控制器:
是下面的方法正確嗎?
$scope.twitter = function() {
$http.get('oauth/twitter').then(function(res) {
// Fetch the user from response and store it somewhere on the client side
});
};
服務器端負責處理身份驗證如下所示:
服務器路線:
app.get('/oauth/twitter', passport.authenticate('twitter', {
failureRedirect: '/signin'
}));
app.get('/oauth/twitter/callback', passport.authenticate('twitter', {
failureRedirect: '/signin',
successRedirect: '/'
}));
Twitter的戰略:
passport.use(new TwitterStrategy({
consumerKey: config.twitter.clientID,
consumerSecret: config.twitter.clientSecret,
callbackURL: config.twitter.callbackURL,
passReqToCallback: true
}, function (req, token, tokenSecret, profile, done) {
var providerData = profile._json;
providerData.token = token;
providerData.tokenSecret = tokenSecret;
var providerUserProfile = {
fullName: profile.displayName,
username: profile.username,
provider: 'twitter',
providerId: profile.id,
providerData: providerData
};
users.saveOAuthUserProfile(req, providerUserProfile, done);
}));
用戶的服務器控制器:
exports.saveOAuthUserProfile = function (req, profile, done) {
User.findOne({
provider: profile.provider,
providerId: profile.providerId
}, function (err, user) {
if (err) {
return done(err);
} else {
if (!user) {
var possibleUsername = profile.username || ((profile.email) ? profile.email.split('@')[0] : '');
User.findUniqueUsername(possibleUsername, null, function (availableUsername) {
profile.username = availableUsername;
user = new User(profile);
user.fullName = profile.fullName;
user.save(function (err) {
if (err) {
var message = getErrorMessage(err);
req.flash('error', message);
return done(err);
}
return done(err, user);
});
});
} else {
return done(err, user);
}
}
});
};
當我點擊Sign in with Twitter
在一個瀏覽器(Chrome/Firefox瀏覽器)我看到正在作出如下要求:
- GET http://localhost:3000/oauth/twitter(302暫時移動)
- GET https://api.twitter.com/oauth/authenticate?oauth_token=Zz014AAAAAAAg5HgAA ********(307內部重定向)
瀏覽r抱怨缺少「Access-Control-Allow-Origin」頭文件。
爲了解決這個問題我一直在使用cors
包這樣
var cors = require('cors');
api.use(cors());
嘗試並手動設置所有響應的頭文件,沒有效果。
你能告訴我方式嗎?除了使用CORS模塊的 問候
沒有效果。 AFAIR這個中間件不能影響來自不同主機的響應(在這種情況下是'api.twitter.com') – Khozzy