2015-06-03 34 views
0

我爲我的web應用程序構建了一個API,它是使用MEAN堆棧構建的。 現在我正嘗試在使用Ionic Framework構建的移動客戶端上使用此API。 我使用這個代碼執行$ HTTP調用API:使用Passport進行Ionic App的角度驗證

$http.post(ServerIP+'/login', {username: $scope.credentials.username, password: $scope.credentials.password}).success(function(response) { 
     $scope.authentication.user = response; 
     $location.path('/'); 
    }).error(function(response) { 
     $scope.error = response.message; 
    }); 

它得到與用戶對象的有效響應,但如果我嘗試從API的被保護部分得到一些信息,它不工作和身份驗證正在重置。

在網絡應用上,我使用相同的代碼,一切工作正常。 這個問題只發生在Ionic應用上。 我已經設置了CORS這樣的:

app.use(function(req, res, next) { 
res.header('Access-Control-Allow-Origin', '*'); 
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With'); 

// intercept OPTIONS method 
if ('OPTIONS' === req.method) { 
    res.sendStatus(200); 
} 
else { 
    next(); 
} 
}); 

請幫幫我!

+0

您是否正在生成並使用令牌或某種策略來匹配請求? –

+0

您是否正在設置withCredentials = true globaly? –

+0

我使用Passport-local-mongoose作爲本地策略。 –

回答

0

我已通過添加基於令牌的認證解決了這個問題。

這裏是它展示瞭如何做到這一點的文章:我的「登陸」路線的https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

樣品:

router.post('/login', passport.authenticate('local'), function(req, res, next){ 
    if (req.user) { 
     var token = jwt.sign(req.user, secret, {expireInMinutes: 60*24*7}); 
     res.json(token); 
    }; 
}); 

有關保護途徑獲取用戶對象,我使用expressJwt({secret: secret})中間件。

0

嘗試在你的角度配置加入這一行:

app.config(function ($httpProvider) { 
    $httpProvider.defaults.withCredentials = true; 
}); 
+0

我已經試過了,但它似乎沒有工作。 在控制檯中,我收到以下消息: 「通配符'*'不能用於'Access-Control-Allow-Origin' –

+0

以解決」通配符「錯誤,您必須指定要訪問的url : res.header('Access-Control-Allow-Origin','http://myfrontendapp.com'); 但你在Ionic,我認爲你沒有一個域名(我不確定),檢查這個博客可能會幫助 http://blog.ionic.io/handling-cors-issues-in -ionic/ –

+0

我通過使用jsonwebtoken和express-jwt解決了我的問題。似乎最好的辦法是簡單地使它基於令牌 –

相關問題