2017-02-24 8 views
0

したがって、node.js、passport.js、およびangular2を利用して簡単なログイン/認証ツールを構築しようとしています。私の現在の問題は、ユーザーがログインできる間に、セッション情報がフロントエンドサーバーに渡されないように見えるか、フロントエンドサーバーがパスポート情報を戻さないことです。Passport.jsはパスポートのユーザー情報を保存/送信していません

ユーザーがログインすると、res.sendが呼び出された部分が表示され、その時点でserializeが呼び出され、req.sessions.passport.userが設定されています。ただし、ユーザーが許可されたページに移動しようとすると、クッキーはそこにありますが、パスポートはありません。デシリアライズされたものは決して呼び出されませんが、ミドルウェアは呼ばれる/呼び出されます。ミドルウェアがデシリアライザに到達すると、パスポート/ユーザが添付されていないので、デシリアライズは呼び出されません。

CORSの問題かangular2の問題かどうかは分かりませんが、私は数日間この作業を進めており、これを示唆しているようです。私はまた、それを再構築し、CORSをミドルウェアと一緒に複数の方法で設定しようとしましたが、私はアイデアが不足しています。私もエクスプレスセッションを使用していますが、それは私がそこに作成するクッキーが存在するため動作しているようです。認証の終わりに

セッションデータが、サイト セッション{ クッキーに応答する前に: {パス: '/'、 _expires:ヌル、 originalMaxAge:ヌル、 HttpOnlyの:真、確保 :偽}、 パスポート: {ユーザー: 匿名{ユーザー名: 'テスト'、 ハッシュ '4024ca40c4372e029459a1d2d52a25b2fc4642f980f6cc948cc4b35f6350adde' }}}

セッションデータをさらに行った後 セッション要求{: {パス: クッキーは '/'、 _expires:ヌル、 originalMaxAge:ヌル、 HttpOnlyの:真、 安全な:}}偽

関連するコード: Passport.js

passport.serializeUser((user, done) => { 
    done(null, user); 
}); 

passport.deserializeUser((users, done) => { 
    var id=users.username; 
    db.one('select * from users where username = $1', id) 
    .then((user) => { 
    done(null, user); 
    }) 
    .catch((err) => { done(err,null); }); 

}); 

local.js

const passport = require('passport'); 
const LocalStrategy = require('passport-local').Strategy; 
const init = require('./passport'); 
var promise = require('bluebird'); 
var options = { 
// Initialization Options 
promiseLib: promise 
}; 

var hashclient = require('hashapi-lib-node'); 
const crypto = require('crypto'); 
var hash = crypto.createHash('sha256'); 
var pgp = require('pg-promise')(options); 
var connectionString = 'postgresql://...'; 
var db = pgp(connectionString); 
const optionsPassport = {}; 
init(); 

passport.use(new LocalStrategy(optionsPassport, (username, password, done) => { 
db.one('select * from users where username = $1', username) 
.then((user) => { 
    hash.update(password); 
    var encryptedPassword=hash.digest('hex'); 
    hash = crypto.createHash('sha256'); 
    if (!user) return done(null, false, { message: 'Incorrect username.' }); 
    if (encryptedPassword!=user.password) { 
    return done(null, false, { message: 'Incorrect information.' }); 
    } else { 
    return done(null, user); 
    } 
}) 
.catch((err) => { return done(err); }); 
})); 

helpers.js

function loginRequired(req, res, next) { 
    if (!req.user) return res.status(401).json({status: 'Please log in'}); 
    return next(); 
} 

Router.js例

const users = require('express').Router(); 
const auth = require('./auth'); 
const update = require('./update'); 
const password = require('./password'); 
const authHelpers = require('./helpers'); 
const passport = require('./local'); 

users.post('/update', authHelpers.loginRequired, update); 
users.get('/:userId', authHelpers.loginRequired, single); 
users.post('/create', create); 
users.post('/auth', passport.authenticate('local'), auth); 

app.js

var passport = require('passport'); 
app.use(cookieParser()) 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(session({ 
    secret: 'X+a1+TKXwd26mkiUUwqzqQ==', 
    resave:true, 
    saveUninitialized:true, 
    cookie:{secure:false} 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 


app.use(function (req, res, next) { 
    var allowedOrigins = ['http://localhost:3000'] 
    res.header('Access-Control-Allow-Origin', allowedOrigins); 
    res.header('Access-Control-Allow-Headers', 'withCredentials, Access-Control-Allow-Headers, Origin, X-Requested-With, X-AUTHENTICATION, X-IP, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Request-Headers'); 
    res.header('Access-Control-Allow-Methods', 'GET, OPTIONS, HEAD, POST, PUT, DELETE'); 
    res.header('Access-Control-Allow-Credentials', true); 

    next(); 
    }); 

var routes = require('./routes'); 
app.use('/', routes); 

フロントエンドHTTPサービス

getData (url:string, data:any): Observable<any> { 
var headers = new Headers({ 'Content-Type': 'application/json', withCredentials: true }); 
var options = new RequestOptions({ headers: headers }); 
return this.http.get(url,options) 
       .map((res: Response): data => res.json()) 
       .catch(this.handleError); 
} 
+0

promiseLib:約束が間違ったカテゴリにあります。 –

+0

私はチェックを倍増させましたが、https://github.com/vitaly-t/pg-promise#initialization-optionsによれば、それはポストグルの正しいカテゴリのようですか? – Legman

+0

ルールには整合性制約が適用されていますか?それらのすべてを投稿してください。 –

答えて

0

は、問題は、私は設定していませんでしたフロントエンドにありました正しい場所でtrueをtrueにする

var options = new RequestOptions({ headers: headers, withCredentials: true }); 
関連する問題