web-dev-qa-db-ja.com

Node.jsアプリのREST API?

RESTAPI。Express。MongoDBを使用し、クライアント側にBackbone.jsを使用するNode.jsアプリを作成しています。最後の2日間は、これらすべてを解決しようとしており、あまり運がありませんでした。

バックエンドとフロントエンドを可能な限り分離したいので、慎重に設計されたREST APIが良いと思います。iPhoneアプリの開発に取り掛かればまたはそのような何か)、APIを使用してデータにアクセスできます。

しかし、私はこれが安全であることを望みます。ユーザーが私のWebアプリにログインしました。APIが安全であることを確認したいと思います。 OAuthについて読んだ、OAuth 2.0、OpenID、Hmac、ハッシュなど...外部ログイン(Facebook/Twitter/etc)の使用を避けたい)登録とログインを私のアプリ/サーバー上。

...しかし、私はまだここで混乱しています。深夜か脳が揚げただけかもしれませんが、ここで何をするべきかについていくつかのステップを踏んで本当にできました。安全なAPIを作成するための手順は何ですか?

ヘルプ、情報、例、手順などは素晴らしいものです。助けてください!

67
littlejim84

これについては別の考え方があります。

しばらくの間、APIを使用していないと仮定しましょう。ユーザーはアプリにログインして資格情報を提供し、ユーザーに何らかの種類のCookieまたは同様のトークンを提供します。これを使用して、ユーザーがログインしていることを識別します。変更/削除)、このトークンをチェックして、ユーザーがその情報を表示できることを確認します。

さて、あなたがここで変更しているのは、情報の配信方法だけであるように思えます。情報をレンダリングされたHTMLとして配信する代わりに、情報をJSONとして返し、クライアント側でレンダリングします。サーバーへのAJAXリクエストは以前と同じログイントークンを保持するため、そのトークンをチェックし、情報を「ユーザーが知ることができるものだけ」に制限することをお勧めします。同じやり方で。

あなたのAPIはあなたのログインと同じくらい安全です-もしAPIにアクセスするのに必要なトークンを誰かが知っていたら、彼らもサイトにログインし、とにかくすべての情報にアクセスできます。最良の方法は、すでにログインを実装している場合、これ以上の作業を行う必要はないということです。

OAuthなどのシステムのポイントは、通常はサードパーティのアプリケーションから開発者としてこの「ログイン」メソッドを提供することです。これは、iPhoneアプリなどに適したソリューションになる可能性があります、しかし、それは将来です。複数の認証方法を受け入れるAPIには何の問題もありません。

28
mjtamlyn

セキュリティ/複雑さの順に:

基本的なHTTP認証

多くのAPIライブラリでこれをビルドできます(たとえば、Djangoのピストン)またはWebサーバーに処理させることができます。NginxとApacheの両方は、サーバーディレクティブを使用して、単純なb64encodedパスワード:世界で最も安全なものではありませんが、少なくともユーザー名とパスワードです!

Nginxを使用している場合は、次のようにホスト構成にセクションを追加できます。

auth_basic "Restricted";
auth_basic_user_file /path/to/htpasswd;

(あなたのlocation /ブロック)

ドキュメント: http://wiki.nginx.org/HttpAuthBasicModule

そのパスワードを生成し、出力をファイルに入れるには、pythonスクリプトを取得する必要があります。 http://trac.edgewall.org/browser/trunk/contrib/ htpasswd.py?format=txt

Nginxがアクセスできる限り、ファイルの場所は重要ではありません。

HTTPS

サーバーからアプリへの接続を保護します。これは最も基本的なものであり、中間者攻撃を防ぎます。

Nginxでこれを行うことができます。そのドキュメントは非常に包括的です。 http://wiki.nginx.org/HttpSslModule

このための自己署名証明書は問題ありません(そして無料です!)。

APIキー

これらは任意の形式にすることができますが、必要に応じてアクセスを取り消すことができます。接続の両端を開発している場合、おそらく完璧なソリューションではありません。 APIを使用するサードパーティ(Githubなど)がある場合に使用される傾向があります。

OAuth

OAuth 2.0はここで使用するものです。仕様の基本的な仕組みはわかりませんが、現在のほとんどの認証(Twitter、Facebook、Googleなど)の事実上の標準であり、それらを実装するために役立つライブラリとドキュメントがたくさんあります。そうは言っても、通常はサードパーティのサービスに認証を求めることでユーザーを認証するために使用されます。

両端で開発を行うことを考えると、おそらくOAuthをいじって時間を無駄にしたくない場合は、おそらく基本HTTP認証の背後にAPIを置いてHTTPS経由で提供するだけで十分でしょう。

39
ghickman

これまでの回答は、説明するのに非常に役立ちましたが、実際の手順は示していません。 Node + Passportを使用してトークンを安全に作成および管理する方法について詳しく説明しているこのブログ投稿に出会いました。

http://aleksandrov.ws/2013/09/12/restful-api-with-nodejs-plus-mongodb/

8
andyzinsser

Webアプリケーションを保護するための有効なヒント

アプリケーションを保護したい場合は、、HTTPの代わりにHTTPSを使用して開始する必要があります。これにより、ユーザーとユーザーの間に安全なチャネルを作成し、ユーザーとの間でやり取りされるデータのスニッフィングを防ぎ、交換されるデータの機密性を保つことができます。

JWT(JSON Web Tokens)を使用してRESTful APIを保護できます。これには、サーバー側セッションと比較して多くの利点があります。主な利点は次のとおりです。

1- APIサーバーは各ユーザーのセッションを維持する必要がないため、よりスケーラブルです(多くのセッションがある場合は大きな負担になる可能性があります)

2- JWTは自己完結型であり、たとえばユーザーロールを定義するクレームと、ユーザーがアクセスできるものと日付と有効期限(JWTは無効になる)を定義するクレームを持っています。

3-ロードバランサー全体での処理がより簡単になります.JWTを使用したリクエストがどのサーバーにヒットしても認証できるので、セッションデータを共有したり、同じサーバーにセッションをルーティングするようにサーバーを構成したりする必要がないため、複数のAPIサーバーがある場合認可済み

4- DBへの負荷が少なくなり、リクエストごとにセッションIDとデータを常に保存および取得する必要がなくなります。

5-強力なキーを使用してJWTに署名する場合、JWTを改ざんすることはできないため、リクエストとともに送信されるJWTのクレームを、ユーザーセッションと承認されているかどうかを確認することなく信頼できます。 、JWTを確認するだけで、このユーザーが誰と何ができるかを知ることができます。

JWTを実装するNode.js固有のライブラリ:

多くのライブラリは、JWTを作成および検証する簡単な方法を提供します。たとえば、node.jsで最も人気のあるものの1つは jsonwebtoken で、JWTの検証にも同じライブラリを使用するか express-jwt または koa-jwt (express/koaを使用している場合)

REST APIは一般にサーバーをステートレスに保つことを目的としているため、各リクエストは自己完結型の認可トークン)で送信されるため、JWTはその概念との互換性が高くなりますJWT)サーバーは、ユーザーとその役割を記憶するようにサーバーをステートフルにするセッションと比較して、ユーザーセッションを追跡する必要はありませんが、セッションも広く使用され、その長所があります、必要に応じて検索できます。

注意すべき重要な点の1つは、HTTPSを使用してJWTをクライアントに安全に配信し、安全な場所(ローカルストレージなど)に保存する必要があることです。

JWTの詳細についてはこちらをご覧ください このリンクから

0
Ahmed Elkoussy