簡體   English   中英

在REST服務中啟用身份驗證

[英]Keep Authentication enable in REST services

所以問題是:我在Jersey上開發了在Glassfish上運行的REST服務。 對於身份驗證,我實現了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返回給用戶。

Darrel Miller所述 ,基於REST的服務應該是無狀態的。 但是為了幫助您解決當前的問題,我建議您使用身份驗證令牌和刷新策略。

描述:每次成功認證后,您的服務器都可以返回一個唯一的 27 [任意長度]數字字符串。 該令牌可能有也可能沒有到期政策[取決於您想要的內容]。 因此,對於后續身份驗證(當客戶端應用程序具有auth令牌時),您實際上可以提供新的auth令牌並使前一個令牌無效。

此外,對於其他所有API調用,您都可以發送此身份驗證令牌,以驗證請求是否來自經過身份驗證的來源。 現在,當用戶注銷應用程序時,您只需從客戶端刪除身份驗證令牌即可。

下次用戶返回到應用程序時,該應用程序將沒有身份驗證令牌,並且可以重定向到登錄屏幕。

基於REST的服務應該是無狀態的。 理想情況下,服務器上應該沒有登錄概念。 您可以通過決定是否發送authn標頭來在客戶端上模擬登錄/注銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM