2016-04-25 6 views
0

すべてのチュートリアルや未完成のドキュメントはありません。これが私がここで尋ねる理由です:簡単なチュートリアルはありますか?パスポートとセイルのために本当に効果がありますか?passport.jsをsails.jsに統合するためのドキュメントまたはチュートリアルはありますか?

+0

http://iliketomatoes.com/implement-passport-js-authentication-with-sails-js-0-10-2/ これは素晴らしいチュートリアルです!!! – vkstack

+0

参考資料を読んでコードを書く必要があるかもしれませんし、 "チュートリアル" –

+0

かもしれませんが、ドキュメントが完成していないか、動作しない可能性があります。あなたはそれを試しましたか?それは本当に効果がありましたか? URLを投稿して、それを読んで試してみてください。何かがうまくいかないときは、私はあなたに尋ねます。ありがとうございました。 – Suisse

答えて

2

これは、2つの帆のJS 最初とパスポートを統合手順に従って: - 依存関係 //application_directory/package.json

{ 
... 
    "dependencies": { 
    ... 
    "passport": "~0.1.16", 
    "passport-local": "~0.1.6", 
    "bcrypt": "~0.7.6" 
    } 
... 
} 

2- 下application_directory/package.json内部 一覧これらの依存関係をユーザーモデルを作成するには、次のコマンドを実行します。

sails generate model user 

3-モデルuser.js will以下

var bcrypt = require('bcrypt'); 

module.exports = { 

    attributes: { 
    username: { 
     type: 'string', 
     required: true, 
     unique: true 
    }, 
    password: { 
     type: 'string', 
     required: true 
    }, 
    toJSON: function() { 
     var obj = this.toObject(); 
     delete obj.password; 
     return obj; 
    } 
    }, 

    beforeCreate: function(user, cb) { 
    bcrypt.genSalt(10, function(err, salt) { 
     bcrypt.hash(user.password, salt, function(err, hash) { 
     if (err) { 
      console.log(err); 
      cb(err); 
     }else{ 
      user.password = hash; 
      cb(null, user); 
     } 
     }); 
    }); 
    } 

}; 

のように見える -

sails generate controller 
AuthControllerは、次のようになります

帆は、コマンドを入力してコントローラを作成するには: - 追加

var passport = require('passport'); 
module.exports = { 

    login: function (req, res) { 
    res.view(); 
    }, 
    process: function(req, res){ 
    passport.authenticate('local', function(err, user, info) { 
     if ((err) || (!user)) { 
     return res.send({ 
     message: 'login failed' 
     }); 
     res.send(err); 
     } 
     req.logIn(user, function(err) { 
     if (err) res.send(err); 
     return res.send({ 
      message: 'login successful' 
     }); 
     }); 
    })(req, res); 
    }, 
    logout: function (req,res){ 
    req.logout(); 
    res.send('logout successful'); 
    } 
}; 

module.exports.blueprints = { 
    actions: true, 
    rest: true, 

    shortcuts: true 

}; 

次のコードをapplication_directory/config/routes.jsに追加します

module.exports.routes = { 
    // (This would also work if you had a file at: `/views/home.ejs`) 
    '/': { 
    view: 'home/index' 
    }, 

    '/login': { 
    controller: 'AuthController', 
    action: 'login' 
    }, 
    '/logout': { 
    controller: 'AuthController', 
    action: 'logout' 
    } 
    ...... 
} 

- インサイドapplication_directory/configのファイルpassport.jsを作成し、その

var passport = require('passport'), 
LocalStrategy = require('passport-local').Strategy; 
module.exports = { 
    express: { 
    customMiddleware: function(app){ 
     console.log('Express midleware for passport'); 
     app.use(passport.initialize()); 
     app.use(passport.session()); 
    } 
    } 
}; 

に次のコードを追加 - インサイド/ API /サービス/ファイルpassport.jsを作成しますその

var passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    bcrypt = require('bcrypt'); < /code> 
//helper functions 
function findById(id, fn) { 
    User.findOne(id).done(function (err, user) { 
    if (err) { 
     return fn(null, null); 
    } else { 
     return fn(null, user); 
    } 
    }); 
} 

function findByUsername(u, fn) { 
    User.findOne({ 
    username: u 
    }).done(function (err, user) { 
    // Error handling 
    if (err) { 
     return fn(null, null); 
     // The User was found successfully! 
    } else { 
     return fn(null, user); 
    } 
    }); 
} 

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

passport.deserializeUser(function (id, done) { 
    findById(id, function (err, user) { 
    done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy(
    function (username, password, done) { 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 
     findByUsername(username, function (err, user) { 
     if (err) 
      return done(null, err); 
     if (!user) { 
      return done(null, false, { 
      message: 'Unknown user ' + username 
      }); 
     } 
     bcrypt.compare(password, user.password, function (err, res) { 
      if (!res) 
      return done(null, false, { 
       message: 'Invalid Password' 
      }); 
      var returnUser = { 
      username: user.username, 
      createdAt: user.createdAt, 
      id: user.id 
      }; 
      return done(null, returnUser, { 
      message: 'Logged In Successfully' 
      }); 
     }); 
     }) 
    }); 
    } 
)); 

に次のコードを追加します - authenticatを変更ed.jsが内部に存在するファイル/ API /ポリシー/

/** 
* Allow any authenticated user. 
*/ 

    module.exports = function (req, res, ok) { 

     // User is allowed, proceed to controller 

      var is_auth = req.isAuthenticated() 
      if (is_auth) return next(); 
      // User is not allowed 
      else return res.redirect("/login"); 
     }; 
+0

thx Ahmed、最後にスナップされたこのisAuthenticated()はどこから来たのですか?私はbcrypt.compare()関数でも "var returnUser"のuserrole(isAdmin)を返しました - どうすればそのポリシーを書くことができますか?ログインしているユーザーが管理者であるかどうかを確認するにはどうすればよいですか? – Suisse

+0

私はそれを見つけました。 if(req.isAuthenticated()){console.log(req.user.isAdmin);} – Suisse

関連する問題