したがって、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);
}
promiseLib:約束が間違ったカテゴリにあります。 –
私はチェックを倍増させましたが、https://github.com/vitaly-t/pg-promise#initialization-optionsによれば、それはポストグルの正しいカテゴリのようですか? – Legman
ルールには整合性制約が適用されていますか?それらのすべてを投稿してください。 –