REST API認証


181

サーバー上でホストされるアプリケーションを構築しています。アプリケーション用のAPIを構築して、任意のプラットフォーム(Webアプリ、モバイルアプリ)とのやり取りを容易にしたいと考えています。私が理解していないのは、REST APIを使用するときに、ユーザーを認証する方法です。

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


4
おそらくここで「REST認証」を検索する必要があります。それは他の多くの質問でカバーされています。
ブライアンケリー

10
簡単に言えば、クライアントにHTTP基本認証(SSL経由)を使用してすべてのリクエストでユーザー名とパスワードを送信させるか、一度認証すると、クライアントが認証されたセッションを保持します。 Webフレームワークのセッション処理)。次に、このセッションをCookieに保存するか、すべてのリクエストで渡されるパラメーター(JavaランドのJSESSIONIDなど)にすることができます。
2012


セキュリティの観点から@opyateを使用すると、攻撃者がユーザーの同意なしにリクエストを送信できるため、REST APIのケースでCookieを使用してセッションを処理することはあまりお勧めできません。HTTPヘッダー(Authorizationなど)にセッションハッシュまたはトークンを含めることをお勧めします。
s3v3n 2016年

1
@ s3v3n私が間違っている場合は修正してください。ただし、あなたと私の提案はどちらも、ヘッダーとローカルストレージの組み合わせを使用して同じことを実行する方法が異なるだけです。それのAuthorizationヘッダ+例えば、ブラウザのlocalStorage VSのCookieヘッダ+標準ブラウザのCookieの保存。
2016

回答:


72

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

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

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


4
この質問とLes Hazelwood(Apache Shiroの作者)が提供した回答を読んでください。
justin.hughey 2014年

1
TwitterがREST APIを保護する便利なリンク:Twitter REST APIのセキュリティ
WildDev

これは受け入れられた回答であるため、ダイジェスト認証も使用できることを説明することが重要だと思います。ここでは基本とダイジェスト認証との違いについての記事を読む:stackoverflow.com/questions/9534602/...
Rayee Roded

116

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

考えてみてください-この現在のリクエストは認証されたユーザーからのものであることを「Create Forum」APIに伝えるハンドシェイクが必要です。REST APIは通常ステートレスであるため、状態はどこかに永続化する必要があります。REST APIを使用するクライアントは、その状態を維持する責任があります。通常、これは、ユーザーがログインしたときからパススルーされるトークンの形式です。トークンが適切であれば、リクエストは適切です。

Amazon AWSが認証を行う方法を確認します。これは、あるAPIから別のAPIへの「引き渡し」の完璧な例です。

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

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

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


つまり、あなたが説明しているのは、本質的にはセッションCookieです。
LordOfThePigs 2014

はい。ただし、セッションは2つの異なる場所で「維持」されます。1つはAPIサーバーに、もう1つはブラウザにあります。ログイン後のブラウザへのJSON(またはその他の)レスポンスは、APIサーバーのセッションIDをブラウザに返します。これらのセッションは、それぞれのエージェントによって個別に管理されます。
Kingz 2014

11
Kingzは、セッションを維持するメカニズムが意図的にあいまいであるという考えを伝えようとしていたと思います。セッションCookieは、そのメカニズムの実装の1つにすぎません。
justin.hughey 2014年

2
@Kingz、このソリューションのセキュリティはどうですか。たとえば、ハッカーがリンクをsession_idでスニッフィングし、どのセッションが正しいsession_idのリクエストを送信し始めた場合などですか。サーバー接続にsslを追加することで解決できますが、クライアントはどうですか?
Ahmad Samilo、2015

1
man-in-the-middle-attrackのケースでセッションハイジャックを防ぐ方法は?
m0z4rt 2015年

38
  1. HTTP基本認証を使用してクライアントを認証しますが、ユーザー名/パスワードは一時的なセッショントークンとしてのみ扱います

    セッショントークンは、すべての HTTPリクエストに添付される単なるヘッダーですAuthorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

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

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

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

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


1
20分後に期限切れになるのはなぜですか?FacebookのようなWebサイトで、ユーザーがログアウトするまでのログインはどうなりますか?
Dejell 2015

1
@dejel「セッション」は一時的なものであるという想定の下にありました。ユーザーがアイドリングしていると期限切れになるのが一般的です
gerrytan

Base64とは何ですか?一時的なパスワードを返すだけです。どちらの場合も、本当に重要なのは、この一時的なパスワードが強力であることです。チェックsecurity.stackexchange.com/a/19686/72945を
e18r

7

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

これにより、WebアプリやモバイルアプリからAPIのクライアントアプリケーションを簡単に開発できるようになります。

お役に立てば幸いです。


2
この質問とLes Hazelwood(Apache Shiroの作者)による回答を読んでください。
justin.hughey 2014年

0

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.