22

JavaScriptクライアントから利用されるPHPRESTAPIを構築していますが、認証とアクセスの側面を実装する方法を理解するのにいくつかの問題があります。私が開発しているJavaScriptライブラリを使用して、アプリケーションと対話したり対話したりするアプリケーションが複数あります。それぞれにAPIキーを提供するので、それは問題ではありません。

私が混乱し始めるのは、これらのサイトのユーザーに私のアプリケーションを認証させる方法です。この外部サイトにユーザーのアカウントとパスワードの情報を保存させるのは悪い考えのようです。したがって、JavaScriptライブラリに、アプリケーションのユーザーのアカウント情報を要求するログインウィジェットを含める必要があると思います。

ここで認証が成功した場合、REST APIを使用しているため、取得したトークンをクライアント側のCookieなどに保存して、ユーザーがのすべてのページでアプリケーションに再度ログインする必要がないようにする必要があります。外部サイト。ただし、ユーザーが外部サイトからログアウトしてから、別のユーザーが同じブラウザーからログインした場合はどうなりますか?JavaScriptライブラリに関する限り、Cookie /トークンの有効期限がまだ切れていないため、古いユーザーは引き続きアプリケーションにログインします。前のユーザーのセッションが終了したときにCookieをクリアするにはどうすればよいですか。または、私はここで完全に正しい道から外れていますか?

したがって、プロセスは次のようになると思います。

var token; // Some hashed string containing an expiration date and user id
var apiKey = '123abc';

// Read the cookie and check if it already contains the token
token = readCookie('token');
if (token == '') {
    // get username and password from user through some prompt

    var request_data = {apiKey: apiKey, user: username, pass: password};
    $.post('https://service.com/api/user/login', request_data, function(data) {
        token = data;
        document.cookie = "token=" + token;
    });
}

...

var get_data = {apiKey: apiKey, token: token};
$.get('http://service.com/api/<object>', get_data, function(data) {
    // Do something with data
});

申し訳ありませんが、ここにはいくつかの質問が埋め込まれています。主なものは、トークンをCookieに保存している場合ですが、ユーザーが外部アプリケーションからログオフしたときにトークンがクリアされるようにするにはどうすればよいですか?または、Cookieに保存する必要がない場合、クライアントにユーザーの状態を認識させるにはどうすればよいですか?

4

3 に答える 3

41

RESTful API の保護に関するこの非常に優れたブログ投稿を読むことをお勧めします。

(このリンクが機能しない場合、リンクは一度死んでおり、archive.org から取得する必要があります。このページの PDF レンダリングと思われるものを見つけました。ここからアクセスできます: https://www.ida. liu.se/~TDDD97/labs/hmacarticle.pdf .)

注:上記のブログ投稿で提供されているソリューションは Javascript クライアントから保護されていないため、私の回答はトピックから外れています。実際、主にサーバー側で REST API を保護する方法について説明しています。

于 2013-01-16T12:47:50.733 に答える
8

「私が混乱し始めたのは、これらのサイトのユーザーをアプリケーションに対して認証させる方法です。この外部サイトにユーザーのアカウントとパスワード情報を保存させるのは悪い考えのようです。」-

REST API を使用してこれを処理する最善の方法は、クライアント (Web ページ、モバイル アプリ) を使用することです。これは、ドメインによって制御されるか、ユーザーが (ログイン ページで) 入力したユーザー資格情報を介して外部パスによって制御されます。認証を処理するログイン/ログアウト API があります。

ログイン API が認証されると、クライアント側の暗号化された Cookie に格納できるトークン (おそらくユーザー設定の一方向ハッシュ) が返されます。この方法では、クライアントがユーザー資格情報を直接処理することはありません。トークンはいつでも期限切れになるように設定されています。

以降のすべての REST API 呼び出しで、クライアントはこのトークンを要求とともに API に送信します (これはログイン/ログアウト API とは異なります)。API はおそらく、(REST サーバー上の) ローカル キャッシュをチェックして、これが有効なトークンであるかどうかを確認します。見つかった場合は、リクエストを受け入れます。それ以外の場合は、エラーがスローされます。

トークンの有効期限が切れる前にユーザーがログアウトすると、ログイン/ログアウト API はこのトークンをローカル キャッシュから削除し、クライアントはセッション/Cookie を削除する必要があります。

このようにして、資格情報がクライアント側で渡されることはありません。

もちろん、移動中のデータのセキュリティも、SSL と HTTP ダイジェストによって実現する必要があります。

于 2013-11-20T03:20:03.260 に答える
1

別のホスト名から独自のホスト名へのクロスドメインになるプライベート API (users テーブルがある) である場合、上記に同意し、単純な (SSL) ログイン/ログアウトを提案し、その時点でユーザー (またはドメインから Cookie を削除します。

パブリック API の場合 (誰でも API キーを取得できるなど)、上記の回答のブログ投稿のメソッドを使用することをお勧めします。

JavaScript クライアントについては、何か足りない場合はhttps://github.com/jpillora/jquery.restを試してください。機能リクエストを送信するか、必要に応じて貢献してください :)

于 2013-01-18T12:30:19.367 に答える