簡體   English   中英

帆JS護照http 401

[英]Sails JS passport http 401

我試圖在護照http包的幫助下保護我的風帆js rest api但是目前我無法弄清楚我的代碼中的錯誤在哪里。 我使用這個repo和本教程來了解它應該如何工作。 我的問題是我的代碼總是返回401.我真的不知道在哪里尋找錯誤。 如果您需要有關我的代碼的更多信息,請發表評論 布魯諾

編輯:我找到了問題的根源(在@Viktor的幫助下)。 我只是不太了解HTTP-Basic身份驗證的工作原理。 現在的問題是如何發送我的身份憑證和我的數據? 如果我只使用auth(...)測試路線,它們可以工作......但是如何添加數據呢? 或者我是否必須先驗證我並在第二個請求中發送數據?

passport.js

var passport = require('passport');
var BasicStrategy = require('passport-http').BasicStrategy;
var bcrypt = require('bcrypt');

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findOne({
    id: id
  }, function(err, user) {
    done(err, user);
  });
});

passport.use('user-authentication', new BasicStrategy(
  function(mail, password, done) {
    sails.log.error("hallo");
    User.findOne({
      mail: mail
    }, function(err, user) {
      if (err) {
        return done(err);
      }

      if (!user) {
        return done(null, false, {
          message: 'Incorrect email.'
        });
      }

      // Make sure the password is correct
      bcrypt.compare(password, user.password, function(err, isMatch) {
        if (err) {
          return done(err);
        }

        // Password did not match
        if (!isMatch) {
          return done(null, false, {
            message: 'Invalid Password'
          });
        }

        // Success
        return done(null, user);
      });
    });
  }
));

isAuthenticated.js

var passport = require("passport");


module.exports = function (req, res, ok) {
    passport.authenticate("user-authentication", {
        session: false
    }, function (err, user, info) {
        if (err || !user) {
            res.set("WWW-Authenticate", "Basic realm=\"Restricted\"");

            return res.send("You are not permitted to perform this action", 401);
        }

        req.session.user = user;
        return ok(null, user);

    })(req, res, ok);
};

policies.js

module.exports.policies = {
  '*': true,

  'UserController': {
    update: 'isAuthenticated'
  }
}

UserController.test.js

var request = require('supertest');
var async = require('async');

describe('UserController', function() {

  describe('#new()', function() {
    it('...', function (done) {
      request(sails.hooks.http.app)
      .post('/user/new')
      .send({ own_number: '654122', password: 'test', mail: 'test@test.com', device_id: '1234', numbers: [1234567] })
      .expect(200)
      .end(done);
    });
  });

  describe('#update()', function(){
    it('...', function (done) {
      async.series([

        function(callback){
          request(sails.hooks.http.app)
          .post('/contact/update')
          .send({ number: 1234, mail: "test@test.com", password: "test" })
          .expect(200)
          .end(callback);
        },

        function(callback){
          request(sails.hooks.http.app)
          .post('/user/update')
          .send({ numbers: [1234], mail: "tet@test.com", password: "test" })
          .expect(200)
          .end(callback);
        }
      ], done);
    });
  });

});

適合我 - 一旦數據庫中有有效用戶,我就能夠進行身份驗證以及訪問和管理用戶數據。 使用空的用戶數據庫,當然會得到401 ,因為這些策略不允許您創建第一個進行身份驗證的用戶。 暫時禁用config/policies.jsUserController策略,您可以創建第一個用戶。

假設您在數據庫中至少有一個有效用戶,那么讓我們縮小問題范圍。 您從isAuthenticated.js記錄erruser獲得了什么輸出? 如果你得到nullfalse ,在passport.js的不同步驟中會發生什么 - 你是否能夠通過數據庫中的電子郵件地址找到用戶並且密碼是否匹配?

您是否有自定義路由和控制器操作,或者您是否使用藍圖?

編輯:您的更新測試將使用HTTP基本身份驗證:

describe('#update()', function(){
  it('...', function (done) {
    async.series([

      function(callback){
        request(sails.hooks.http.app)
        .post('/contact/update')
        .auth('test@test.com', 'test')
        .send({ number: 1234, mail: "test@test.com", password: "test" })
        .expect(200)
        .end(callback);
      },

      function(callback){
        request(sails.hooks.http.app)
        .post('/user/update')
        .auth('test@test.com', 'test')
        .send({ numbers: [1234], mail: "tet@test.com", password: "test" })
        .expect(200)
        .end(callback);
      }
    ], done);
  });
});

這里的文檔中可以看出,您需要用戶名和密碼。 因此,查看您的代碼,您可以使用郵件代替用戶ID,這就是您獲得401或至少可以開始查找的原因。 如果您需要驗證這一點,可以在這里查看passport-http基本策略

passport.use(new BasicStrategy( function(userid, password, done) { User.findOne({ mail: userid, password: password }, function (err, user) { done(err, user); }); } ));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM