3

私は、いくつかの異なる場所から消費する予定のステートレスな REST ベースの API を書いていて、そのうちの 1 つは単一ページの Javascript Web アプリケーションになります。基本的には、クライアントごとに異なる API を使用するのではなく、さまざまなクライアント (他の人によって作成された可能性があるが、ユーザー データへのアクセスが必要な可能性があるクライアントを含む) から使用される単一の API を使用することです。

私が現在直面している問題は認証です。理想的には、自分で作成するのではなく、ここで標準的なものを使用したいのですが、実際に適合する標準的なものを見つけるのに苦労しています. また、電話をかけている人に応じて異なる認証メカニズムの解決策を回避しようとしています。この段階では、実際にアプリケーションを使用しているユーザーの認証 (ユーザー名とパスワードなどを介して) 以外は何も必要ありませんが、Web ページではないクライアントがそれを使用したい場合は、それを使用する必要があります。おそらく同様に認証されます。

私が見てきたことから、これを行う最善の方法は、実際には HTTPS 接続で HTTP 基本認証を使用することだと思われます。これには何かが欠けていると思わざるを得ません。明らかな代替手段は OAuth 1.0 のようです - これは潜在的に安全でない Javascript セッションがクライアントシークレットを知っていることを必要とします - または OAuth 2.0 - SSL 経由でユーザー名/パスワードを使用してアクセストークンを生成し、そのアクセスを使用することに戻るようですこれは基本的に HTTP Basic と同じですが、少し難読化されています。

ここでは HTTP ダイジェストを数えていないことに注意してください。単に、私が理解しているように、サーバーに渡されるのは、パスワードを取得できない形式 (つまり、ハッシュ化されたもの) で含むものであり、パスワードをバックエンドに保存する場合です。取得できない形式でも、2つを比較することはできません...

4

1 に答える 1

1

ユーザーのログインを処理するための別の API を作成します。API クライアント (JS Web ページ) は、HTTP ダイジェスト + SSL を介してこのログイン API にユーザー名/パスワードを送信できます。その後、API はユーザー ストア (DB またはファイルなど) に対してログインを実行し、結果 (アクセスの承認/拒否) を返します。

承認された場合、認証されたトークンを返す必要があります (たとえば、ユーザー名 + パスワード + 役割 + 権限 + 日時などに対する一方向ハッシュ関数など)。

JS クライアントによる (ブラウザを介した) 以降のすべてのリクエストでは、このトークン (おそらく暗号化された Cookie でユーザー セッション オブジェクトに保持される) を、操作しているすべての API に送信する必要があります。トークンの有効期限が切れるまで時間を設定できます。その後、ユーザーは再ログインを強制されます。

このアプローチはステートレス性を維持しますが、いくつかの問題があります。ログイン トークンが盗まれたり、ユーザーによって共有されたりした場合はどうなりますか? トークンの有効期間中、トークンのコピーを持っている人は誰でも、ユーザーになりすましてクエリを実行できます (中間者)。SSL は、それがメッセージの最も外側のエンベロープになることを防止する必要があります。

REST (ビジネス) API と REST (ログイン) API の間で何らかのハンドシェイクを行うことを想像できます。したがって、REST ビジネス API がこのトークンを受け取ると、ログイン API に、これを作成したかどうか、およびどのユーザー エージェントのために作成したかを確認するように依頼できます。

とにかく、単純なアプリケーションの場合、上記のアプローチで十分です。

于 2013-11-20T03:07:05.050 に答える