web-dev-qa-db-ja.com

特定のドメインのみがREST apiからクエリできることを確認するにはどうすればよいですか?

REST apiを含むアプリがあります。REST apiに対して行うことができるリクエストがアプリから発信されたリクエストのみであるように、それ自体はどうすればよいですか?node.js + expressサーバーも使用しています。

編集:アプリは完全にパブリックWebアプリです。

18
omega

リクエストにヘッダーを定義するだけです。これにより、特定のドメインからのリクエストのみが許可され、他のドメインは即座に拒否されます。

response.set('Access-Control-Allow-Origin', 'domain.tld');

編集:Webスクレイピングに本当に熱心な場合は、クライアントのオリジンを再確認する関数を作成できます。

function checkOrigin (Origin) {
   if (Origin === "your.domain.tld") {
     return true;
   } else {
     return false;
   }
}
/* Handling it in response */
if (checkOrigin(response.headers.Origin)) {
  // Let client get the thing from API
} else {
  response.write("Send them error that they're not allowed to use the API");
  response.end();
}

上記の例は、デフォルトのHTTP/HTTPSモジュールで機能し、Expressでも機能するはずです。

編集2:Expressでも機能するという私の主張を裏付けるために、私はこの見積もりを彼らのドキュメントで見つけました。

Req(リクエスト)とres(レスポンス)は、Nodeが提供するオブジェクトとまったく同じなので、req.pipe()、req.on( 'data'、callback)を呼び出すことができます。 Expressを使用せずに実行するその他のこと。

5
Cernodile

クライアントからAPIキーを使用することをお勧めします。 CORSフィルターは簡単に回避できません。

0
R. Gulbrandsen

安全な 安全な実装方法REST node.jsを使用したAPI

上記の投稿の概要:

ユーザーはリソース(別名POST/PUTアクション)を作成できるため、APIを保護する必要があります。 oauthを使用することも、独自のソリューションを構築することもできますが、パスワードが本当に簡単に見つかると、すべてのソリューションが壊れる可能性があることに注意してください。基本的な考え方は、ユーザー名を使用してユーザーを認証することです。 、パスワード、トークン、別名apitoken。このapitokenはnode-uuidを使用して生成でき、パスワードはpbkdf2を使用してハッシュできます

次に、セッションをどこかに保存する必要があります。プレーンオブジェクトのメモリに保存した場合、サーバーを強制終了して再起動すると、セッションが破棄されます。また、これはスケーラブルではありません。 haproxyを使用してマシン間の負荷分散を行う場合、または単にワーカーを使用する場合、このセッション状態は単一のプロセスに保存されるため、同じユーザーが別のプロセス/マシンにリダイレクトされた場合は、再度認証する必要があります。したがって、セッションを共通の場所に保存する必要があります。これは通常、redisを使用して行われます。

ユーザーが認証されると(username + password + apitoken)、セッションの別のトークン(別名accesstoken)が生成されます。ここでも、node-uuidを使用します。ユーザーにaccesstokenとユーザーIDを送信します。 userid(キー)とaccesstoken(値)は、有効期限付きのredisに格納されます。 1時間。

これで、ユーザーがREST APIを使用して操作を行うたびに、ユーザーIDとアクセストークンを送信する必要があります。

0
Cole Roberts