7

Sails.io.js を使用して、websocket を介して Sails バックエンドと通信する AngularJS アプリを実装しました。

バックエンドは基本的に純粋な API であり、他のアプリからも接続されるため、セッションを完全に無効にして JWT を使用しようとしています。

私は express-jwt をセットアップしており、通常の HTTP リクエストを非常にうまく使用できますが、sails.io.js を介してリクエストを送信すると、何も起こりません。Websocket リクエストはクライアントで保留されたままになり、サーバーでは何も起こりません ( 「愚かな」ログレベルで)。

クエリ パラメーターをサポートするために、sails.io.js にパッチを適用しようとしました。接続時に、Angular からトークンを送信しましたが、最良の場合、express-jwt から資格情報が見つからないというエラー メッセージが返されます。 ..

また、sailsの socket.jsを beforeConnect で変更する必要があるといういくつかのヒントも見ました。

誰かがこれを実装し、Sails とソケットで JWT を使用していますか? どの方向に進むべきかについてのヒントをいただければ幸いです:)

4

1 に答える 1

8

私が導入したポリシーと、抽象化された express-jwt を使用していることに気づきました。そのため、正確に何が起こっているのかわかりませんでした。他の例を見てみると、websocket リクエストと通常のリクエストの違いを確認するだけでよいことがわかり、すぐに問題を回避する方法を見つけました。

そう:

  1. ログイン時のトークン署名と送信を設定する
  2. Angular はトークンを受け取り、ローカル ストレージに保存します
  3. 認証ヘッダーとトークンを追加するための HTTP 要求のインターセプターを作成する
  4. オプションを介して提供されるクエリ パラメータを転送するように Sails.io.js を修正します (質問で述べたように)。
  5. Sails.io.js を使用して接続する場合、クエリ パラメータとしてトークンを送信します。つまり、url + '?token=' + token
  6. Sails ポリシーでは、以下のように、req.socket.handshake.query を含むトークンのすべての組み合わせを確認します。

    module.exports = function (req, res, next) {
    
    var token;
    
    if (req.headers && req.headers.authorization) {
    
        var parts = req.headers.authorization.split(' ');
    
        if (parts.length == 2) {
    
            var scheme = parts[0],
            credentials = parts[1];
    
            if (/^Bearer$/i.test(scheme)) {
                token = credentials;
            }
    
        } else {
            return res.json(401, {err: 'Format is Authorization: Bearer [token]'});
        }
    
    } else if (req.param('token')) {
    
        token = req.param('token');
        // We delete the token from param to not mess with blueprints
        delete req.query.token;
    
    }
    
    // If connection from socket
    else if (req.socket && req.socket.handshake && req.socket.handshake.query && req.socket.handshake.query.token) {
    
        token = req.socket.handshake.query.token;
    
    } else {
        sails.log(req.socket.handshake);
        return res.json(401, {err: 'No Authorization header was found'});
    }
    
    JWTService.verifyToken(token, function (err, token) {
    
        if (err) {
            return res.json(401, {err: 'The token is not valid'});
        }
    
        sails.log('Token valid');
    
        req.token = token;
    
        return next();
    
    });
    
    };
    

それはうまくいきます!:)

于 2015-05-15T10:30:36.513 に答える