2013-03-25 3 views
0

Итак, проблема в том, что я разработал услуги REST на Джерси, которые работают на Glassfish. Для аутентификации я внедрил Basic-Authentication. На стороне клиента я выполнил аутентификацию через ApacheHTTPClient.Включить аутентификацию в службах REST

Моей идеей является просто попросить аутентификацию, когда зарегистрированный пользователь входит - например, Login. Это настроено в клиентском приложении (чтобы проверка подлинности была действительной до выхода пользователя) или в службы REST, где я настроил базовую аутентификацию?

Спасибо!


Это, как я делаю Вход на клиента App:

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.

ответ

0

Услуги на основе REST должны быть без гражданства. В идеале не должно быть понятия входа на сервер. Вы можете смоделировать логин/выход на клиент, решая, отправлять ли заголовок authn или нет.

+0

Но дело в том, что я хочу попросить аутентификацию пользователя, когда он впервые войдет в систему. После регистрации он может использовать эти службы REST. И я не хочу запрашивать аутентификацию в каждой обслуживаемой им службе. Я правильно понял? – user2144555

+0

@ user2144555 Переключение в какой-либо токен-носитель для заголовка пользователя/пароля auth является разумным вариантом, предложенным Atrix1987. Но, по сути, вы просите аутентифицироваться по каждому запросу, просто используя немного другой заголовок auth после первого запроса. –

+0

И это просто дополнение к моей аутентификации HttpClient? – user2144555

1

Как указано Darrel Miller, службы на основе REST должны быть без гражданства. Но чтобы помочь вам решить вашу текущую проблему, я бы предложил использовать токен auth и обновить политику.

Описание: После каждой успешной аутентификации сервер может возвращать уникальный 27 [любую длину вы хотите] значную строку. Этот токен может иметь или не иметь политику истечения срока действия [зависит от того, что вы хотите]. Поэтому для последующей аутентификации [когда клиентское приложение имеет токен аутентификации] вы можете фактически предоставить новый токен аутентификации и аннулировать предыдущий.

Дополнительно для каждого другого вызова API вы можете отправить этот токен аутентификации, чтобы проверить, является ли запрос аутентифицированным источником или нет. Теперь, когда пользователь выходит из приложения, вы можете просто удалить токен аутентификации с клиентской стороны.

В следующий раз, когда пользователь вернется к приложению, приложение не будет иметь токен аутентификации и может быть перенаправлено на экран входа в систему.

+0

Это кажется приятным! Могу ли я использовать Auth Token с аутентификацией HttpClient? – user2144555

+0

Я просто поместил свой код в комментарий. Я не могу найти полезную информацию о реализации ** auth token ** ... – user2144555

+0

проверить эту ссылку SO: http://stackoverflow.com/questions/14003334/what-is-the-point-of-authentication -tokens-на-Rest-услуг – Atrix1987

Смежные вопросы