2017-10-18 38 views
0

APIを初めてビルドしました。次のタスクを合理的に実行する方法を理解する上で問題があります。REST APIでリソースへのアクセスを許可する

エンドポイントがある:

/ユーザ/ {USER_ID}

ユーザの詳細情報を検索します。 フロントエンドコードは、このエンドポイントに、ダッシュボードに表示するユーザーに関する詳細を取得するよう要求します。 このエンドポイントを保護して、このを表すユーザーuser_idが他のユーザーに関する情報を取得する要求をエミュレートするようにする必要があります。

RESTベースのAPIはセッションがないため、セッションキーを保存できません。では、ユーザーIDの所有者が要求した場合にのみサーバーがユーザー情報を送信するようにするにはどうすればよいですか?

+0

[トークン認証](https://stormpath.com/blog/token-authentication-scalable-user-mgmt)を使用してください。 – James

+0

より一般的な回答はhttps://stackoverflow.com/questions/7551/best-practices-for-securing-a-rest-api-web-service?rq=1になります。あなたはJWT(Json Web Tokens)を検討することができます.https://medium.facilelogin.com/jwt-jws-and-jwe-for-not-so-dummies-b63310d201a3 –

答えて

1

あなたは正しいです。 HTTPはステートレスなプロトコルなので、RESTもその品質を継承します。

ここでは簡単な言葉での取引です。

[RESTクライアント] -------> [APIエンドポイント]

あなたは多くのRESTクライアントを持っている、とあなたが許可されたユーザーだけがあなたへのアクセスを許可することを確認する必要がありますAPIエンドポイント。 @Jamesが提案する1つの解決策は、JWT https://tools.ietf.org/html/rfc7519などのトークンメカニズムを使用することです。

JWT認証を検討する場合、プロセスフローは次のようになります。

[RESTクライアント] -------> [AAサービス] -------> [APIエンドポイント]

  • あなたはAAが必要になります(Authorization、Authentication)サービスを提供しています。たとえば、マイクロサービスのアプローチでは、これはすべてのサービスへのゲートウェイであるAPIゲートウェイから実行できます。

  • クライアントは、AAサービスにユーザ名とパスワードを与えます。交換AAサービスでは、クライアントのみにサーバーによって署名されたJSONトークンが与えられ、機密性が保護されます。このトークンには3つのものが含まれます。それを誰にトークンが発行されるようにクレームを含んでいる

  • ペイロードに署名するために使用されるトークンとアルゴリズムのタイプを指定し

  • ヘッダーは、トークンの有効期限が切れる必要がある場合、発行されたものを、ユーザーの役割は、などでなければなりませんキー

サーバによって署名された符号なしのトークンの生成物は、その後、各ヘッダ、ペイロード、base6と署名をコード

  • 署名(https://tools.ietf.org/html/rfc7519#section-4参照) 4と "。"との連結。あなたは今、JWTを持っています。

    • AAサービスは、資格情報と引き換えにこのJWTを返します。
    • クライアントはこのトークンを安全に保存する必要があり(例:ローカルストレージ)、通信媒体は暗号化する必要があります(例:TLS)。 https://stormpath.com/blog/jwt-the-right-way#how-to-secure-jwthttps://tools.ietf.org/html/rfc7519#section-6
    • その後、すべての後続のREST呼び出しに対して、クライアントはメッセージのペイロードにトークンを送信することも技術的に可能ですが、受信したトークンをAuthorizationヘッダーに含める必要があります。

    • 次に、署名鍵を使用してトークンを復号化し、JWTのクレームを評価し、API呼び出しを許可するかどうかに応じてHTTP 401,403応答を送信するのはAAサービスの責任です。

  • +0

    jwtトークンを使用する場合、user_idは必須ではありませんAPIではトークンがユーザー自身を識別できるため、APIを変更する必要があります。 –

    +0

    必ずしもそうではありません。ユーザIDは依然としてクエリ目的のために他のサービスに渡すために必要です。たとえば、フォーラムサービスでは、回答/コメント投稿またはコメントを一覧表示するために特定のユーザーIDが必要です。通知サービスでは、特定のユーザーに通知を送信するためにユーザーIDが必要な場合があります。しかし、ユーザIDをJWTの形で送る必要はありません。 –

    関連する問題