2015-09-07 79 views
3

我正在嘗試將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瀏覽器)我看到正在作出如下要求:

  1. GET http://localhost:3000/oauth/twitter(302暫時移動)
  2. 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模塊的 問候

回答

0

,嘗試設置頁眉中的NodeJS

app.use(function(req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
    next(); 
}); 
+0

沒有效果。 AFAIR這個中間件不能影響來自不同主機的響應(在這種情況下是'api.twitter.com') – Khozzy

0

我面臨着類似的問題,在代碼中無法修復它。所以我發現這個Chrome擴展:Allow-Control-Allow-Origin: *

您可以設置URL模式並啓用跨源資源共享。

當你完成你的工作時,不要忘記禁用它!

相關問題