web-dev-qa-db-ja.com

保護する簡単な認証方法REST API

私はAPIを保護する簡単な方法を見つけるために必死に努力してきましたが、うまくいく方法をまだ見つけていません。多くのRESTful APIとは異なり、私のAPIはユーザーログイン、期限切れのトークン、または他の複雑な(非常に安全ですが)認証方法を必要としないため、そこにあるほとんどのチュートリアルは使用できません。

私が持っている唯一の要件は、1つのルートでデータベースにレコードを記録するPOSTリクエストは保護する必要があることですが、同じルートのレコードにアクセスするGETリクエストは保護しない必要があります。ログ記録は信頼されており、私はそれらの資格情報を個人的に提供します。

私はここでこの基本的な認証方法を使用してみました:

var basicAuth = require('basic-auth');

var auth = function (req, res, next) {
  function unauthorized(res) {
    res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
    return res.send(401);
  };

  var user = basicAuth(req);

  if (!user || !user.name || !user.pass) {
    return unauthorized(res);
  };

  if (user.name === 'foo' && user.pass === 'bar') {
    return next();
  } else {
    return unauthorized(res);
  };
};

しかし、POSTリクエストは、間違ったユーザー名とパスワードを使用した場合でも機能しました。

そのような基本的な認証が機能するだろうと思ったので、私は本当に何を探すべきかわからない。

編集:私が見落としていたapp.postの後にいくつかのことを変更した後、これをうまく機能させることができました。

6
Andy Morgan

データベース内のデータをクエリするRESTful GETをログに記録せず、そのデータがパブリックであることが意図されている場合、HTTP GETを公開し、Webサーバーに組み込まれたセキュリティを使用して、その操作中に害が発生しないようにすることができます。

RESTful POSTの場合は、最新のSSLであるTLSを使用しますが、自分で実装しないでください。 HTTPS POSTは任意の最新のWebサーバーで簡単にセットアップできます。サーバー側の証明書をインストールするためのヘルプデスクのサポートは、通常CAによってサポートされています。世界中の人々がHTTPS POSTを実装しているため毎日、その操作のサポートにより、実際に安全な簡単なことを行うよりも、設定と保守が簡単になります。

あなたがコーディングしたものは安全ではありません、それはあなたが重要だとは思わないかもしれません。

質問への回答に十分な注意を払うために、電話または紙で資格情報を提供することは、HTTPSなどの安全なプロトコルを使用しないと安全ではないことに注意してください。サーバーで資格情報の値をテストすることに依存すると、見過ごされている可能性のある結果につながる可能性のある大きなセキュリティホールが残ります。

攻撃者はルート上のパスワードを簡単に特定し、クライアント/顧客/訪問者のアカウントとデータを破壊することができます。データがビジネスに不可欠ではない場合でも、保護されていない書き込みは正しく終了しない可能性があります。誰かが、さまざまな理由で、データベースに児童ポルノや軍事秘密を公開する可能性があります。あなたまたは信頼できるユーザーの1人がそれをそこに置いていないことを証明することはできません。

1
FauChristian