对 Angular 视图 (cookie) 的 OAuth 令牌响应
OAuth Token Response to Angular View (cookie)
我已经为此苦苦挣扎了几个小时,需要一些帮助。我创建了一个简单的应用程序,它在 angular 视图中向用户显示 "Login Using Google" 按钮,将用户重定向到 Google Oauth 页面。这是按下按钮时调用 login() 函数的控制器代码:
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);
};
});
我的 google 项目中设置的重定向 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);
}
}
我能够成功地将 google 返回的代码交换为身份验证令牌对象,并将其记录到终端。有人告诉我应该使用以下方法设置 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();
然后是我将用户引导至验证会话的页面上的控制器。
我做错了什么?
既然你已经完成了艰苦的工作,那么谈论 passport.js 是没有意义的,它实际上是为了简化这种社交登录身份验证而编写的。
所以让我们直接进入session实现逻辑。
您需要在您的应用程序中设置以下 header。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"
}
您可以在 angular 服务或控制器中使用客户端功能:
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 端点,returns 身份验证令牌。
您可以将您的授权令牌存储在 localStorage and cookieStore。
localStorage 确保即使在用户关闭浏览器时我们也会保存令牌 session。
如果他清除了 localStorage 和 cookieStorage 两者,那么将他注销,因为您没有任何有效的令牌来授权用户。
这与我使用的逻辑相同here。如果您需要更多帮助,请告诉我。
我已经为此苦苦挣扎了几个小时,需要一些帮助。我创建了一个简单的应用程序,它在 angular 视图中向用户显示 "Login Using Google" 按钮,将用户重定向到 Google Oauth 页面。这是按下按钮时调用 login() 函数的控制器代码:
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);
};
});
我的 google 项目中设置的重定向 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);
}
}
我能够成功地将 google 返回的代码交换为身份验证令牌对象,并将其记录到终端。有人告诉我应该使用以下方法设置 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();
然后是我将用户引导至验证会话的页面上的控制器。
我做错了什么?
既然你已经完成了艰苦的工作,那么谈论 passport.js 是没有意义的,它实际上是为了简化这种社交登录身份验证而编写的。
所以让我们直接进入session实现逻辑。
您需要在您的应用程序中设置以下 header。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"
}
您可以在 angular 服务或控制器中使用客户端功能:
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 端点,returns 身份验证令牌。
您可以将您的授权令牌存储在 localStorage and cookieStore。
localStorage 确保即使在用户关闭浏览器时我们也会保存令牌 session。 如果他清除了 localStorage 和 cookieStorage 两者,那么将他注销,因为您没有任何有效的令牌来授权用户。
这与我使用的逻辑相同here。如果您需要更多帮助,请告诉我。