0

問題は、Glassfish で動作する REST サービスを Jersey で開発したことです。認証については、 Basic-Authenticationを実装し ました。クライアント側では、ApacheHTTPClientを介して Authentication を実装しました。

私の考えは、ログインのように、登録ユーザーが入力したときに認証を求めることです。これは、クライアント アプリケーション (ユーザーがログアウトするまで認証を有効に保つため) で構成されていますか、または基本認証を構成した REST サービスで構成されていますか?

ありがとう!


これは、クライアント アプリでログインを行う方法です。

import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.util.EntityUtils;

public class UserLogin {

    private static final String BASE_URI = "http://localhost:8080/LULServices/webresources";

    public static void main(String[] args) throws Exception {

    final DefaultHttpClient httpclient = new DefaultHttpClient();

    try {
            httpclient.getCredentialsProvider().setCredentials(
                new AuthScope("localhost", 8080),
                new UsernamePasswordCredentials("zzzzz", "xxxxx"));

    HttpPut httpPut = new HttpPut(BASE_URI + "/services.users/login");
    HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000);

    httpPut.addHeader("Content-type", "multipart/form-data");

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("login", "zzzzz"));
    nameValuePairs.add(new BasicNameValuePair("password","xxxxx"));

    httpPut.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    HttpResponse response = httpclient.execute(httpPut);

    try {
            System.out.println("Executing request " + httpPut.getRequestLine());
            HttpEntity entity = response.getEntity();

            System.out.println("----------------------------------------");
            System.out.println("HTTP Status: " + response.getStatusLine());

            String putResponse = EntityUtils.toString(entity);
            System.out.println(putResponse);
            EntityUtils.consume(entity);

        } finally
            httpPut.releaseConnection();

        } finally
            httpclient.getConnectionManager().shutdown();
    }
}

ユーザーに彼の secret_id を返します。

4

2 に答える 2

1

Darrel Millerが述べたように、REST ベースのサービスはステートレスであるべきです。しかし、現在の問題を解決するために、認証トークンと更新ポリシーを使用することをお勧めします。

説明:認証が成功するたびに、サーバーは一意の27 [任意の長さ] 桁の文字列 を返すことができます。このトークンには、有効期限ポリシーがある場合とない場合があります[必要なものによって異なります]。したがって、その後の認証では [クライアント アプリケーションが認証トークンを持っている場合]、新しい認証トークンを実際に提供して、前の認証トークンを無効にすることができます。

さらに、他のすべての API 呼び出しに対して、この認証トークンを送信して、要求が認証されたソースからのものかどうかを検証できます。ユーザーがアプリケーションからログアウトすると、クライアント側から認証トークンを簡単に削除できます。

次にユーザーがアプリケーションに戻ったとき、アプリには認証トークンがなく、ログイン画面にリダイレクトされる可能性があります。

于 2013-03-25T17:20:11.563 に答える
0

REST ベースのサービスはステートレスであるべきです。理想的には、サーバーにログインの概念がないようにする必要があります。認証ヘッダーを送信するかどうかを決定することで、クライアントでのログイン/ログオフをシミュレートできます。

于 2013-03-25T17:09:10.890 に答える