4

認証されたユーザーがアクセスできるようにするいくつかの API エンドポイントを設計しています。このタスクにはパスポートを選択し、ベアラーとローカルの 2 つの認証戦略も選択しました。その背後にある理由は、モバイル アプリケーションが access_token を提供する一方で、管理者ユーザーはユーザー名とパスワードを使用するためです。

私が直面している問題は、ルートに 2 つの認証戦略を追加すると、Bad Request エラー 400 が発生することです。

これを複数の認証プロバイダーを使用した例のpassport.jsとして使用しましたか?

以下はサンプルコードです。

var express = require('express')
, passport = require('passport')
, util = require('util')
, http = require('http')
, BearerStrategy = require('passport-http-bearer').Strategy
, LocalStrategy = require('passport-local').Strategy;


var users = [
{id: 1, username: 'bob', password: 'secret', email: 'bob@example.com', token: '123'}
, {id: 2, username: 'joe', password: 'birthday', email: 'joe@example.com', token: '456'}];

function findByUsernameAndPassword(username, password, fn) {
for (var i = 0, len = users.length; i < len; i++) {
    var user = users[i];
    if (user.username === username && user.password === password) {
        return fn(null, user);
    }
}
return fn(null, null);
}

function findByToken(token, fn) {
for (var i = 0, len = users.length; i < len; i++) {
    var user = users[i];
    if (user.token === token) {
        return fn(null, user);
    }
}
return fn(null, null);
}

function findById(id, fn) {
for (var i = 0, len = users.length; i < len; i++) {
    var user = users[i];
    if (user.id === id) {
        return fn(null, user);
    }
}
return fn(null, null);
}


passport.use(new LocalStrategy(
function (username, password, done) {
    findByUsernameAndPassword(username, password, done);
}
));

passport.use(new BearerStrategy(
function (token, done) {
    findByToken(token, done);
}
));

var app = express();


app.use(passport.initialize());

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

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


app.route('/')
    .get(passport.authenticate(['bearer', 'local']),
    function (req, res) {
        res.json({username: req.user.username, email: req.user.email});
    });

var server = http.createServer(app);

server.listen(3000, function onListen(err) {
    if (err) {
        throw err;
    }
  console.log('app started on port 3000');
});

以下は、私が使用しているモジュールのバージョンです

 "dependencies": {
"express": "^4.12.2",
"passport": "^0.2.1",
"passport-http-bearer": "^1.0.1",
"passport-local": "^1.0.0"
 }

このような問題の原因とその修正方法。

よろしく。

4

0 に答える 0