2015-03-24 20 views
0

我一直在爲此奮鬥了幾個小時,需要一些幫助。我創建了一個簡單的應用程序,用於在用戶將視圖重定向到Google Oauth頁面的角度視圖中向用戶顯示「使用Google登錄」按鈕。下面是調用當按鈕被按下登錄()函數的控制器代碼:OAuth令牌對角度視圖的響應(cookie)

angular.module('dashApp').controller('SigninCtrl', function ($scope) { 

$scope.login=function() { 
    var client_id="191641883719-5eu80vgnbci49dg3fk47grs85e0iaf9d.apps.googleusercontent.com"; 
    var scope="email"; 
    var redirect_uri="http://local.host:9000/api/auth/google"; 
    var response_type="code"; 
    var url="https://accounts.google.com/o/oauth2/auth?scope="+scope+"&client_id="+client_id+"&redirect_uri="+redirect_uri+ 
    "&response_type="+response_type; 
    window.location.replace(url); 
    }; 
}); 

在我的谷歌項目的重定向URI集重定向到一個服務器頁面,該服務器頁面:

'use strict'; 

var _ = require('lodash'); 
var request = require('request'); 
var qs = require('querystring'); 
var fs = require('fs'); 

// Get list of auths 
exports.google_get = function (req,res){ 
    var code = req.query.code, 
     error = req.query.error; 

    if(code){ 
    //make https post request to google for auth token 
    var token_request = qs.stringify({ 
     grant_type: "authorization_code", 
     code: code, 
     client_id: "191641883719-5eu80vgnbci49dg3fk47grs85e0iaf9d.apps.googleusercontent.com", 
     client_secret: process.env.GOOGLE_SECRET, 
     redirect_uri: "http://local.host:9000/api/auth/google" 
    }); 
    var request_length = token_request.length; 
    var headers = { 
     'Content-length': request_length, 
     'Content-type':'application/x-www-form-urlencoded' 
    }; 

    var options = { 
     url:'https://www.googleapis.com/oauth2/v3/token', 
     method: 'POST', 
     headers: headers, 
     body:token_request 
    }; 

    request.post(options,function(error, response, body){ 
     if(error){ 
     console.error(error); 
     }else{ 
     //WHAT GOES HERE? 

     } 
    }); 
    } 
    if(error){ 
    res.status(403); 
    } 
} 

我能夠成功地將谷歌返回的代碼交換爲授權令牌對象並將其記錄到終端。有人告訴我,我應該使用設置cookie:

res.setHeader('Content-Type', 'text/plain'); 
res.setCookie('SID','yes',{ 
    domain:'local.host', 
    expires:0, 
    path:'/dashboard', 
    httpOnly:false 
}); 

res.status(200); 
res.end(); 

跟着我指引用戶在頁面上的控制器驗證會話。

我在做什麼錯?

+0

我沒有看到你的問題是什麼。 – Mavlarn 2015-03-25 02:17:41

+0

我意識到我需要讓角度控制器對服務器執行獲取請求,以實現瀏覽器的初始重新路由 - 現在就開始工作。一旦完成後我會發布代碼更新。 – 2015-03-25 03:36:20

回答

0

既然你已經完成了艱難的工作,所以沒有一點講passport.js其實際寫入簡化這些一種社會登錄認證。

那麼讓我們直接來談談實現邏輯。

你需要設置下面的頭在你的app.js/server.js:

app.use(function(req, res, next) { 
    res.setHeader('Access-Control-Allow-Origin', '*'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST'); 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type, Authorization'); 
    next(); 
}); 

比方說,你在成功登錄後,返回此令牌:

{ 
    name : "some name", 
    role : "some role", 
    info : "some info" 
} 

你可以有一個客戶端功能在您的角度服務或控制器:

function(user,callback){ 
    var loginResource = new LoginResource(); //Angular Resource 
    loginResource.email = user.email; 
    loginResource.password = user.password; 
    loginResource.$save(function(result){ 
     if(typeof result !== 'undefined'){ 
      if(result.type){ 
       $localStorage.token = result.token; 
       $cookieStore.put('user',result.data); 
       $rootScope.currentUser = result.data; 
      } 
     } 
     callback(result); 
    }); 
} 

LoginResource調用您的REST返回授權令牌的端點。

您可以將身份驗證令牌存儲在localStoragecookieStore中。

localStorage確保即使在用戶關閉瀏覽器會話時也保存令牌。 如果他清除localStorage和cookieStorage,則將其註銷,因爲您沒有任何有效令牌來授權用戶。

這是我使用的相同邏輯here。如果您需要更多幫助,請告訴我。

+0

我一直在努力與谷歌已返回我的回調後回到瀏覽器的響應對象。通常,我只是在服務頁面之前驗證用戶,但由於我使用的是Angular視圖,而不是直接從快遞頁面提供html頁面,所以我正在爲此付出努力。 – 2015-03-25 04:06:02

+0

尋找ngRoute或ui.router ..都用於客戶端路由。 – NarendraSoni 2015-03-25 04:40:17

+0

我目前在Angular的所有路線中都使用了ui.router。我是否需要爲我的回調站起來 - 因爲這是服務器響應的發送地點? – 2015-03-25 04:43:29