2016-07-23 12 views
0

これはしばらくは可能かどうかを調べていて、何も見つかりませんでした。パスポートOAuthベアラOR isAuthenticated

基本的に私はPassportを使用してユーザー認証を処理しています。もちろんNode.jsとExpressを使ってサーバーサイドのものを処理します。また、oauth2orizeを使用してOAuthを許可し、API呼び出しを処理しています。

API呼び出しの場合、私はpassport.authenticate('bearer', { session: false })を実行するミドルウェアcontrollerClient.isBearerAuthenticatedを使用します。その後、それはオフになり、passport.use("bearer", new BearerStrategy)の内部で関数を実行します。トークンが有効かどうかを基本的にチェックし、コールバック関数を呼び出します。

APIリクエストではなく通常のウェブページの場合、次のミドルウェアを実行して認証をチェックします。

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) { 
     return next(); 
    } 
    res.redirect('/'); 
} 

だから私の問題です。ベアラトークンがある場合は、私のAPIコールにアクセスできるようにしますまたはreq.isAuthenticated() = trueです。現在、isLoggedInミドルウェアまたはcontrollerClient.isBearerAuthenticatedミドルウェアを使用するかどうかを選択する必要があります。私はそれらを似たようなやり方で組み合わせる方法を見つけようとしています。

私は複数のミドルウェア機能を持つことを考えていたので、isLoggedInを呼び出してからcontrollerClient.isBearerAuthenticatedを呼び出しました。しかし、それはコールバック関数が呼び出され、両方が呼び出されるという問題があるようです。私はまた、次のミドルウェア機能をスキップして次のものに行く方法があるかどうかを調べるために調査していましたが、それについても何も見つかりませんでした。

私は最善の策は、req.isAuthenticated() = trueの場合controllerClient.isBearerAuthenticatedをスキップする方法を把握することだと思います。これを行うより良い方法があるかもしれません、もしそうなら、私はそれを聞きたくなります。

しかし、ユーザーがreq.isAuthenticated()ORcontrollerClient.isBearerAuthenticated経由autheroizedされているかどうかをチェックするためのミドルウェアを使用する方法上の任意の提案ですか?またはこれを達成する最良の方法は何ですか?

もう1つ注意してください。私は以前にthis質問をして、passport.authenticateは実際に 認証を処理することを意味していることを知りました。 それ以外の場合は、 のパスポート戦略の配列でpassport.authenticateを使用します。 connect-ensure-loginを使用すると、私は今connect-sure-loginまたはcontrollerClient.isBearerAuthenticatedを使用しているのと同じ問題が発生します。

ありがとうございます。あまり前もって!

答えて

0

私はうまくいくと思われる解決策を見つけ出すことができました。将来の参考として、同様の問題を抱えている可能性がある人々のために、以下に私のソリューションを掲載します。

以下のコードでミドルウェア機能を基本的に動作させるように見えました。

function isAuthenticated(req, res, next) { 
    //Checking to see if user is authenticated on the web 
    if (req.isAuthenticated()) { 
     return next(); 
    } 
    //If not checking to see if user is authenticated via Bearer and OAuth 
    else { 
     return controllerClient.isBearerAuthenticated.apply(this, arguments); 
    } 
} 

req.isAuthenticatedがtrueに等しいかどうかを確認するだけです。それがコールバック関数を返すだけであれば、API関数が呼び出されます。もしそうでなければ、我々はcontrollerClient.isBearerAuthenticatedをチェックします。これは自動的に次の関数を呼び出すでしょう。そうでない場合は、Unauthorizedと状態コード401を付けて送信します。Unauthorizedメッセージをどのくらい正確に変更するのかがわかりますが、そのことを考えてみましょう。

関連する問題