小编lag*_*lex的帖子

node.js REST api身份验证和oauth2

我有几个问题:

1)对于外部API使用和作为主干(或普通js)前端的服务器端,使用REST API是一个好习惯吗?我认为编写一个REST API服务器并将其用作后端要容易得多.

2)如果我使用oauth 2标准编写我的webapp身份验证,这是将我的秘密令牌存储在cookie中的好方法吗?我认为这会导致CSRF漏洞.

正如我所看到的,passport.js使用cookie存储秘密令牌,例如Facebook或Twitter ......在这种情况下,CSRF是什么?

rest csrf node.js passport.js

7
推荐指数
1
解决办法
2676
查看次数

Passport.js验证无法正常工作

我正试图第一次设置护照,只需要一个谷歌登录选项.我在谷歌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)

javascript node.js express passport.js

7
推荐指数
1
解决办法
3956
查看次数

从passportjs中的刷新令牌获取oauth访问令牌

要确定何时使用刷新令牌来请求新的访问令牌,我知道两种方法(下面).如果不修改passport-google-oauth库,这些方法中的任何一种都可以吗?

1)"先发制人"方法

  • 在授予访问令牌时,保存访问令牌的到期时间
  • 每当使用访问令牌访问API时,请检查当前时间的到期时间
  • 如果访问令牌未过期,请使用它来访问API
  • 如果访问令牌已过期(或接近过期),请提供刷新令牌以获取新的访问令牌

2)"手柄故障"方法

  • 始终提供访问令牌
  • 如果访问令牌无法进行身份验证,请提供刷新令牌,获取新的访问令牌

谢谢.也欢迎任何替代品.

oauth google-api node.js google-oauth passport.js

7
推荐指数
2
解决办法
7310
查看次数

护照facebook登录时出现"不允许需要预检的跨域请求"错误?

我有一个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

7
推荐指数
1
解决办法
2万
查看次数

Node.Js + express + Passport:无法注销用户

我为网络服务器编写了一个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)

node.js express passport.js

7
推荐指数
3
解决办法
2万
查看次数

使用Passport进行身份验证后创建新会话

我用护照创建了一个简单的身份验证应用程序(参见下面的代码).通过会话中间件快速,在请求客户端尚未拥有会话的每个请求上创建会话.我想在登录后分配会话,或者在登录后创建新会话.

这是因为我最终将通过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)

authentication session node.js passport.js

7
推荐指数
2
解决办法
6316
查看次数

(A == B == C)比较如何在JavaScript中进行比较?

我期待以下比较给出错误:

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.

这种"三元"比较如何运作?

javascript comparison truthiness

7
推荐指数
2
解决办法
4091
查看次数

使用OAuth2保护nodejs/sailsjs API

我已经开发了一个带有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的调用之间创建链接.任何的想法 ?

oauth node.js sails.js oauth2orize passport.js

7
推荐指数
1
解决办法
6831
查看次数

使用gruntjs将所有凉亭库合并并缩小

有没有办法将所有凉亭安装的库自动组合并缩小为1个文件?

首先,我尝试了最基本的方法:组合.js所有子目录中的所有文件:

uglify: {
    options: {compress: true},
    my_target: { files: {
        'vendor.js': ['bower_components/**/*.js'],
}   }   }
Run Code Online (Sandbox Code Playgroud)

但这显然是一种糟糕的做法.由于错误太多,它也不起作用.

我手动删除了所有文件,并且只保留了每个库所拥有的1个(主)文件,并且它有效.

有没有办法自动完成这个?

另外,建议这样做吗?(即将所有供应商库合并为1个文件)

minify gruntjs bower grunt-contrib-uglify wiredep

7
推荐指数
2
解决办法
1万
查看次数

Oauth2流没有redirect_uri

我正在创建一个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 google-oauth passport-facebook passport.js

7
推荐指数
2
解决办法
1万
查看次数