我有几个问题:
1)对于外部API使用和作为主干(或普通js)前端的服务器端,使用REST API是一个好习惯吗?我认为编写一个REST API服务器并将其用作后端要容易得多.
2)如果我使用oauth 2标准编写我的webapp身份验证,这是将我的秘密令牌存储在cookie中的好方法吗?我认为这会导致CSRF漏洞.
正如我所看到的,passport.js使用cookie存储秘密令牌,例如Facebook或Twitter ......在这种情况下,CSRF是什么?
我正试图第一次设置护照,只需要一个谷歌登录选项.我在谷歌apis注册,所以我有所有设置.相关代码在下面,但是当我的应用程序进行'/auth/google/'调用时它只是失败而没有响应或错误消息.我已经开启配置了很多方法都无济于事.我还passport.authenticate('google')用一个带有console.log的匿名函数替换了,以便仔细检查我的web服务是否正常运行.所以我知道它已经到了passport.authenticate('google').
// serialize session
passport.serializeUser(function (user, done) {
done(null, user.id);
});
passport.deserializeUser(function (obj, done) {
done(null, obj);
});
// use google strategy
passport.use(new googleStrategy({
clientID: config.google.clientID,
clientSecret: config.google.clientSecret,
callbackURL: config.google.callbackURL,
scope: 'https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile'
},
function(accessToken, refreshToken, profile, done) {
console.log(profile);
}
));
app.use(passport.initialize());
app.use(passport.session());
app.get('/auth/google', passport.authenticate('google'));
app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/', scope: 'https://www.google.com/m8/feeds' }), signin);
Run Code Online (Sandbox Code Playgroud)
编辑:这是我的http请求,我正在使用角度,这个功能与按钮上的ng-click相关联.
$scope.signIn = function () {
$http({method: 'GET', url: '/auth/google'}).
success(function (data, status, headers, config) {
console.log('success');
}). …Run Code Online (Sandbox Code Playgroud) 要确定何时使用刷新令牌来请求新的访问令牌,我知道两种方法(下面).如果不修改passport-google-oauth库,这些方法中的任何一种都可以吗?
1)"先发制人"方法
2)"手柄故障"方法
谢谢.也欢迎任何替代品.
我有一个node.js express app,提供RESTful API,我使用护照进行Facebook身份验证.我在服务器端启用了所有CORS配置,并且能够通过jQuery Ajax使用API.但对于Facebook身份验证,我收到以下错误:
XMLHttpRequest cannot load http://localhost:3000/auth/facebook. The request was redirected to 'https://www.facebook.com/dialog/oauth?response_type=code&redirect_uri=http%…_me%2Cuser_checkins%2Cuser_likes&client_id=12345678&type=web_server', which is disallowed for cross-origin requests that require preflight.
Run Code Online (Sandbox Code Playgroud)
/ auth/facebook端点就是这个.
app.get('/auth/facebook',
passport.authenticate('facebook', {
scope: ['email', 'user_about_me', 'user_checkins', 'user_likes'],
failureRedirect: users.authFailCallback
}), users.signin);
Run Code Online (Sandbox Code Playgroud)
所以基本上它被重定向到Facebook的API(302),它不允许CORS.有什么方法可以解决这个问题吗?或者我需要从服务器端调用Facebook API?
redirect cross-domain node.js facebook-graph-api passport.js
我为网络服务器编写了一个JS脚本,其中包括使用护照和摘要策略进行身份验证.我没有使用会话,但我尝试使用会话,但它不会改变结果.浏览器请求"/ login"路由并显示内置登录对话框.身份验证工作正常,但我无法让用户"注销".问题似乎是浏览器记住登录凭据并自动重新发送.最终结果是用户必须完全关闭浏览器才能注销,但这对此应用程序来说是个问题.我知道必须有一种方法告诉浏览器不要这样做,但我还没弄明白.
我想出了一个让浏览器再次显示登录对话框的黑客攻击; 强制认证功能返回false.但是,我还没有找到一种方法来执行每个会话.现在,如果一个人退出,每个人都会退出.这不是一个可行的解决方案.
谁能告诉我这里我做错了什么?我想知道的一件事是,当它发布到/ logout路由时,我是否正在向浏览器返回正确的响应(参见结束).我返回res.json(""),但是我应该发送一个不同的响应来告诉浏览器忘记会话的凭据?
我的代码如下.非常感谢任何见解.先感谢您.
Ť
var passport = require('passport'),
DigestStrategy = require('passport-http').DigestStrategy;
var express = require('express');
var app = express();
app.configure(function () {
app.use(
"/", //the URL throught which you want to access to you static content
express.static('./www') //where your static content is located in your filesystem
);
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({ secret: 'keep moving forward' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
});
app.listen(80); //the port you want to use
/**
* CORS support.
*/
app.all('*', function(req, res, next){
if …Run Code Online (Sandbox Code Playgroud) 我用护照创建了一个简单的身份验证应用程序(参见下面的代码).通过会话中间件快速,在请求客户端尚未拥有会话的每个请求上创建会话.我想在登录后分配会话,或者在登录后创建新会话.
这是因为我最终将通过HTTPS进行登录,并希望防止黑客劫持已经过身份验证的用户的会话.
这是我的服务器代码:
// Server.js configures the application and sets up the webserver
//importing our modules
var express = require('express');
var app = express();
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var MongoStore = require('connect-mongo')(express);
var configDB = require('./config/database.js');
//Configuration of Databse and App
mongoose.connect(configDB.url); //connect to our database
require('./config/passport')(passport); //pass passport for configuration
app.configure(function() {
//set up our express application
app.use(express.logger('dev')); //log every request to the console
app.use(express.cookieParser()); …Run Code Online (Sandbox Code Playgroud) 我期待以下比较给出错误:
var A = B = 0;
if(A == B == 0)
console.log(true);
else
console.log(false);
Run Code Online (Sandbox Code Playgroud)
但奇怪的是它会回归false.
更奇怪的是,
console.log((A == B == 1));
Run Code Online (Sandbox Code Playgroud)
回报true.
这种"三元"比较如何运作?
我已经开发了一个带有sailsjs的REST API,我想添加OAuth2授权来保护这个API.我对OAuth很新,我不知道从哪里开始.
我找到了几个可用于此目的的模块,例如oauth2orize及其使用示例https://github.com/aaron524/sails-oauth2-provider-example但我不完全理解这是如何在内部工作的.
基本上,我将有几个客户正在使用我正在开发的API: - 我信任的客户,我想使用"资源所有者凭据授权" - 我不信任的客户端,并且将使用授权代码流程
我想在sails应用程序中向Client模型添加一个可信属性,然后当用户登录到一个应用程序时: - 他将直接访问其资源(可信应用程序的情况) - 他将被要求批准或拒绝应用程序访问其资源(不受信任的应用程序的情况)
这是一个好方法吗?有关如何根据客户端可信级别选择相应策略的指示?
UPDATE
我在GitHub上设置了以下项目,使用了我发现的几个教程和项目.
https://github.com/lucj/sails-oauth2-api
Run Code Online (Sandbox Code Playgroud)
该项目尚未实施.
当用户通过应用程序使用API时,我仍然不清楚如何选择正确的授权类型(授权代码与资源所有者的密码).如何将此检查整合到策略中?
我无法在OAuth endPoint(/ oauth/authorize,/ oauth/token)和对oauth2orize的调用之间创建链接.任何的想法 ?
有没有办法将所有凉亭安装的库自动组合并缩小为1个文件?
首先,我尝试了最基本的方法:组合.js所有子目录中的所有文件:
uglify: {
options: {compress: true},
my_target: { files: {
'vendor.js': ['bower_components/**/*.js'],
} } }
Run Code Online (Sandbox Code Playgroud)
但这显然是一种糟糕的做法.由于错误太多,它也不起作用.
我手动删除了所有文件,并且只保留了每个库所拥有的1个(主)文件,并且它有效.
有没有办法自动完成这个?
另外,建议这样做吗?(即将所有供应商库合并为1个文件)
我正在创建一个Android/iOS应用程序,它与Node.js服务器通信,并希望使用Google(和/或Facebook)和OAuth2在我的服务器上安全地识别它们.我查看了以下文档:https://developers.google.com/+/web/signin/server-side-flow
我不需要授权,我只需要身份验证(我只想确保调用我的Node.js服务的人是他们所说的人).为实现这一目标,如果我理解正确,我必须让用户在客户端使用Google登录,这将为他们提供一个authorization_code,然后他们可以将其提供给我的服务器.然后,我的服务器可以为access_token交换该代码,从而检索有关用户的信息.然后我保证用户就是他们所说的人.
谷歌文档(上面的链接)说:"在授权重定向URI字段中,删除默认值.它不用于这种情况."但是,对于我的服务器交换access_token的authorization_code,它需要提供一个redirect_uri我错过了什么吗?
redirect_uri例如,对于Unity游戏来说,它是无用的(因为登录Google只会打开一个新的"窗口",登录后关闭,不涉及重定向).
TL; DR如何在没有重定向的情况下使用OAuth2在我的客户端和服务器之间对用户进行身份验证?
node.js ×8
passport.js ×8
express ×2
google-oauth ×2
javascript ×2
oauth ×2
bower ×1
comparison ×1
cross-domain ×1
csrf ×1
google-api ×1
gruntjs ×1
minify ×1
oauth2orize ×1
redirect ×1
rest ×1
sails.js ×1
session ×1
truthiness ×1
wiredep ×1