私はサーバー上でホストされるアプリケーションを構築しています。私は、あらゆるプラットフォーム(Webアプリケーション、モバイルアプリケーション)からのやり取りを容易にするためにアプリケーション用のAPIを構築したいです。私が理解していないのは、REST APIを使用するときに、ユーザーをどのように認証するのかということです。
たとえば、ユーザーがログインしてからフォーラムトピックを作成したい場合などです。ユーザーがすでにログインしていることをどのように確認できますか?
HTTP基本認証またはダイジェスト認証を使用できます。その上でSSLを使用してユーザーを安全に認証できますが、APIが少し遅くなります。
OAuthが最高です。 oAuthがもたらす利点は取り消し可能または期限切れのトークンです。実装方法については以下を参照してください。コメントからの作業リンク: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf
たとえば、ユーザーがログインしたとき。フォーラムトピックを作成したいと言った場合、ユーザーが既にログインしていることをどのように確認できますか?
それについて考えてください - この現在のリクエストは認証されたユーザーからのものであることをあなたの "Create Forum" APIに伝えるハンドシェイクがあるはずです。 REST APIは通常ステートレスなので、状態は永続化する必要がありますどこかに。 REST APIを使用しているクライアントは、その状態を維持する責任があります。通常、ユーザーがログインしてから渡されるトークンの形式です。トークンが良好であれば、リクエストは正常です。
Amazon AWSによる認証方法を確認してください。これは、あるAPIから別のAPIへの「負担の軽減」の好例です。
*以前の回答に実用的な回答を追加することを考えました。 Apache Shiro(または任意の認証/承認ライブラリ)を試してください。つまり、カスタムコーディングを避けてください。お気に入りのライブラリ(私はApache Shiroを使用しています)を統合したら、次のことができます。
/api/v1/login
とapi/v1/logout
のようなログイン/ログアウトAPIを作成します。JSESSIONID
)です。/api/v1/findUser
というAPIに対して行われたとしましょう。それで全部です。お役に立てれば。
クライアントを認証するにはHTTP Basic Authを使用しますが、ユーザー名/パスワードは一時セッショントークンとしてのみ処理します。
セッショントークンは、every HTTPリクエストに付けられた単なるヘッダです。例:Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0
上記の文字列Ym9ic2Vzc2lvbjE6czNjcmV0は、Base64でエンコードされた文字列 "bobsession1:s3cret"(ユーザー名/パスワード)です。
上記の一時セッショントークンを取得するには、マスターユーザー名とマスターパスワードを入力として受け取り、サーバー側で一時的なHTTP基本認証ユーザー名/パスワードを作成してトークンを返すAPI関数(例:http://mycompany.com/apiv1/login
)を提供します。 :Ym9ic2Vzc2lvbjE6czNjcmV0)。このユーザー名/パスワードは一時的なもので、20分後に期限切れになります。
セキュリティを強化するために、情報がプレーンテキストで転送されないように、RESTサービスがHTTPS経由で提供されるようにしてください。
Javaを使用している場合は、Spring Securityライブラリが上記のメソッドを実装するための優れたサポートを提供します。
私は最善のアプローチはOAuth2を使うことだと思います。グーグルそれとあなたはそれを設定するのに役立つたくさんの役に立つ投稿を見つけるでしょう。
WebアプリやモバイルアプリからあなたのAPI用のクライアントアプリケーションを開発することがより簡単になります。
お役に立てば幸いです。
私はJWT認証を使っています。私のアプリケーションでは問題なく動作します。
ユーザーの資格情報を必要とする認証方法があります。このメソッドは認証情報を検証し、成功した場合はアクセストークンを返します。
このトークンは、リクエストのヘッダーにある私のWeb APIの他のすべてのメソッドに送信する必要があります。
実装は非常に簡単で、テストも非常に簡単です。