web-dev-qa-db-ja.com

REST AP​​I認証

私はサーバー上でホストされるアプリケーションを構築しています。私は、あらゆるプラットフォーム(Webアプリケーション、モバイルアプリケーション)からのやり取りを容易にするためにアプリケーション用のAPIを構築したいです。私が理解していないのは、REST AP​​Iを使用するときに、ユーザーをどのように認証するのかということです。

たとえば、ユーザーがログインしてからフォーラムトピックを作成したい場合などです。ユーザーがすでにログインしていることをどのように確認できますか?

177
Noor

HTTP基本認証またはダイジェスト認証を使用できます。その上でSSLを使用してユーザーを安全に認証できますが、APIが少し遅くなります。

  • 基本認証 - ユーザー名とパスワードにBase64エンコードを使用します
  • ダイジェスト認証 - ネットワーク経由で送信する前に、ユーザー名とパスワードをハッシュします。

OAuthが最高です。 oAuthがもたらす利点は取り消し可能または期限切れのトークンです。実装方法については以下を参照してください。コメントからの作業リンク: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf

70
ankitjaininfo

たとえば、ユーザーがログインしたとき。フォーラムトピックを作成したいと言った場合、ユーザーが既にログインしていることをどのように確認できますか?

それについて考えてください - この現在のリクエストは認証されたユーザーからのものであることをあなたの "Create Forum" APIに伝えるハンドシェイクがあるはずです。 REST AP​​Iは通常ステートレスなので、状態は永続化する必要がありますどこかに。 REST AP​​Iを使用しているクライアントは、その状態を維持する責任があります。通常、ユーザーがログインしてから渡されるトークンの形式です。トークンが良好であれば、リクエストは正常です。

Amazon AWSによる認証方法を確認してください。これは、あるAPIから別のAPIへの「負担の軽減」の好例です。

*以前の回答に実用的な回答を追加することを考えました。 Apache Shiro(または任意の認証/承認ライブラリ)を試してください。つまり、カスタムコーディングを避けてください。お気に入りのライブラリ(私はApache Shiroを使用しています)を統合したら、次のことができます。

  1. /api/v1/loginapi/v1/logoutのようなログイン/ログアウトAPIを作成します。
  2. これらのログインおよびログアウトAPIでは、ユーザーストアで認証を実行します。
  3. 結果は、クライアント(Web、モバイルなど)に送り返されるトークン(通常はJSESSIONID)です。
  4. これ以降、クライアントによって行われた後続のすべての呼び出しにこのトークンが含まれます。
  5. 次の呼び出しが/api/v1/findUserというAPIに対して行われたとしましょう。
  6. このAPIコードが最初に行うことは、トークンを確認することです(「このユーザーは認証されていますか?」)。
  7. 答えがNOと返ってきた場合は、HTTP 401ステータスをクライアントに返します。彼らにそれを処理させましょう。
  8. 答えがYESの場合は、要求されたユーザーを返すように進みます。

それで全部です。お役に立てれば。

112
Kingz
  1. クライアントを認証するにはHTTP Basic Authを使用しますが、ユーザー名/パスワードは一時セッショントークンとしてのみ処理します。

    セッショントークンは、every HTTPリクエストに付けられた単なるヘッダです。例:Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

    上記の文字列Ym9ic2Vzc2lvbjE6czNjcmV0は、Base64でエンコードされた文字列 "bobsession1:s3cret"(ユーザー名/パスワード)です。

  2. 上記の一時セッショントークンを取得するには、マスターユーザー名とマスターパスワードを入力として受け取り、サーバー側で一時的なHTTP基本認証ユーザー名/パスワードを作成してトークンを返すAPI関数(例:http://mycompany.com/apiv1/login)を提供します。 :Ym9ic2Vzc2lvbjE6czNjcmV0)。このユーザー名/パスワードは一時的なもので、20分後に期限切れになります。

  3. セキュリティを強化するために、情報がプレーンテキストで転送されないように、RESTサービスがHTTPS経由で提供されるようにしてください。

Javaを使用している場合は、Spring Securityライブラリが上記のメソッドを実装するための優れたサポートを提供します。

35
gerrytan

私は最善のアプローチはOAuth2を使うことだと思います。グーグルそれとあなたはそれを設定するのに役立つたくさんの役に立つ投稿を見つけるでしょう。

WebアプリやモバイルアプリからあなたのAPI用のクライアントアプリケーションを開発することがより簡単になります。

お役に立てば幸いです。

7
Paulo Henrique

私はJWT認証を使っています。私のアプリケーションでは問題なく動作します。

ユーザーの資格情報を必要とする認証方法があります。このメソッドは認証情報を検証し、成功した場合はアクセストークンを返します。

このトークンは、リクエストのヘッダーにある私のWeb APIの他のすべてのメソッドに送信する必要があります。

実装は非常に簡単で、テストも非常に簡単です。

0
Arthur Medeiros