2015-03-24 3 views
0

Я боролся с этим в течение нескольких часов и нуждаюсь в некоторой помощи. Я создал простое приложение, которое представляет пользователю кнопку «Войти с помощью Google» с угловым видом, который перенаправляет пользователя на страницу Google Oauth. Вот код контроллера, который вызывает функцию Логин() при нажатии кнопки:OAuth Token Response to Angular View (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 в моем проекте Google перенаправляет на страницу сервера для этого сервера страницы:

'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); 
    } 
} 

I «Могу успешно обменять код, возвращенный google для объекта токена аутентификации, и зарегистрировать его на терминале. Мне сказали, что я должен установить печенье с помощью:

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

+0

Я понял, что мне нужно заставить угловой контроллер выполнить запрос получения на сервер для первоначальной повторной маршрутизации браузера - теперь работаем над этим. Я отправлю обновление кода, как только я закончил с этим. –

ответ

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 конечная точка, которая возвращает токен аутентификации.

Вы можете сохранить свой токен аутентификации в localStorage и cookieStore.

localStorage гарантирует, что мы сохраняем токен, даже если пользователь закрыл сеанс браузера. Если он очищает localStorage и cookieStorage, то выйдите из него, поскольку у вас нет действительного токена для авторизации пользователя.

Это та же логика, которую я использую here. Если вам нужна дополнительная помощь, дайте мне знать.

+0

Я борюсь с объектом ответа, возвращая его в браузер после того, как Google вернул мой обратный вызов. Обычно я просто проверял пользователя до обслуживания страницы, но поскольку я использую угловые представления вместо того, чтобы обслуживать html-страницы непосредственно из выражения, я боюсь с ним. –

+0

Ищите ngRoute или ui.router .. оба используются для маршрутизации на стороне клиента. – NarendraSoni

+0

В настоящее время я использую ui.router для всех своих маршрутов в Angular. Нужно ли мне встать на путь для моего обратного вызова - так как будет отправлен ответ сервера? –