web-dev-qa-db-ja.com

ループバック認証にJWTを使用する

カスタムJWTルーティングをループバックセキュリティモデルに適合させる方法を理解しようとしています。私のアプリケーションには、SMSを含む認証「ダンス」があり、 優れた説明 を使用して有効なJWTトークンが生成されます。 jsonwebtoken を使用しています=そして物事は期待どおりに機能します。トークンを取得した後、angular.jsクライアントはAuthorisation: JWT ..token..ヘッダーの各リクエストでトークンを送信します(矛盾するドキュメントが見つかりました。1つはJWT、1つはベアラーですが、私はそれを理解できます)。

ここで、ループバックアプリケーション内でトークンを利用したいと思います。ループバックが提供するACLシステムを使用したいと思います。私は次のリソースを読みました:

そして、私は私の次のステップが何であるかはっきりしていません。私は働いています:

  • ユーザー「ログイン」-JWTの生成
  • ユーザー名/パスワードを使用したユーザーログイン(廃止予定)
  • ループバックでのACL実装の動作(ACLで保護されたリソースにアクセスすると、予想どおり4xxエラーが発生します)
  • リクエストのヘッダーに適切に(?)JWTトークンがあります

私は欲しい:

  • jWTトークンに基づいて、ループバックACLと互換性のあるロールを持つ有効なユーザー

ヘルプは非常に高く評価されています

10
stwissel

解決策は、私よりもはるかに簡単であることがわかりました。初心者の場合、ループバックは独自のjwt webtokenを使用して(ステートレス)ユーザーセッションを維持します。 IDを確立した後(私の場合はJWTトークンから携帯電話番号を抽出します)、メンバーを検索してループバックネイティブJWTトークンを生成する必要があります。私のエンドポイントの定義は次のとおりです。

  Member.remoteMethod(
    'provideSMSToken', {
      accepts: [{
        arg: 'mobilenumber',
        type: 'string',
        description: 'Phone number including +65 and no spaces'
      }, {
        arg: 'token',
        type: 'string',
        description: 'the token received through SMS'
      }],
      returns: {
        arg: 'token',
        type: 'string'
      },
      description: 'provide SMS token to confirm login',
      http: {
        path: '/smsauthenticate',
        verb: 'post'
      },
      isStatic: true
    }

  );

そしてprovideSMSToken関数は次のようになります:

 // Exchange the SMS Token with a login token
  Member.provideSMSToken = function(mobilenumber, token, cb) {
    var app = Member.app;
    // CHeck if the token does exist for the given phone number
    // if yes, check for the respective memeber

    if (!app.smsVerificationToken || !app.smsVerificationToken[mobilenumber] || app.smsVerificationToken[mobilenumber] !== token) {
      var wrongToken = new Error("Wrong or missing token");
      cb(wrongToken, "Wrong or missing token");
    } else {
      var timetolive = 86400;
      Member.lookupByPhone(mobilenumber, function(err, theOne) {
        if (err) {
          cb(err, "Sorry, no such member here!");
        } else {
          // We can provide a token now for authentication
          // using the default createAccessToken method
          theOne.createAccessToken(timetolive, function(err, accesstoken) {
            cb(err, accesstoken);
          })
        }
      });
    }
  }

チャームのように機能します

3
stwissel