2013-03-25 2 views
0

문제는 다음과 같습니다. 저지에서 Glassfish에서 실행되는 REST 서비스를 개발했습니다. 인증을 위해 기본 인증을 구현했습니다. 클라이언트 측에서는 ApacheHTTPClient을 통해 인증을 구현했습니다.REST 서비스에서 인증 사용 유지

제 아이디어는 등록 된 사용자가 로그인 할 때 인증을 요청하는 것입니다. 클라이언트 응용 프로그램 (사용자가 로그 아웃 할 때까지 인증을 유효하게 유지하기 위해) 또는 기본 인증을 구성한 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에 반환 내가 클라이언트 응용 프로그램에 로그인을하고 있어요 방법이있다


.

답변

0

REST 기반 서비스는 Stateless이어야합니다. 이상적으로는 서버에 로그인한다는 개념이 없어야합니다. authn 헤더를 전송할지 여부를 결정하여 클라이언트에서 로그인/로그 오프를 시뮬레이트 할 수 있습니다.

+0

하지만, 처음으로 시스템에 들어가면 사용자 인증을 요청하고 싶습니다. 그는 기록한 후에 REST 서비스를 사용할 수 있습니다. 그리고 나는 그가 소비하는 각 서비스에서 인증을 요구하고 싶지 않습니다. 나는 바로 생각하니? – user2144555

+0

@ user2144555 Atrix1987에서 제안한대로 사용자/비밀번호 인증 헤더에 대한 어떤 종류의 베어러 토큰을 스와핑하는 것이 합당한 옵션입니다. 그러나 사실상 모든 요청에 ​​대해 인증을 요청합니다. 첫 번째 요청 이후 약간 다른 인증 헤더를 사용합니다. –

+0

그리고 그것은 단지 HttpClient 인증에 대한 보완책입니까? – user2144555

1

Darrel Miller에 언급 된 바와 같이 REST 기반 서비스는 stateless이어야합니다. 그러나 현재 문제를 해결하는 데 도움이되도록 auth 토큰 및 새로 고침 정책을 사용하는 것이 좋습니다.

설명 : 서버가 독특한 27 원하는 길이] 자리 문자열을 반환 할 수있는 모든 인증이 성공하면. 이 토큰에는 [원하는 것에 따라] 만료 정책이 있거나 없을 수 있습니다. 따라서 후속 인증의 경우 [클라이언트 어플리케이션에 인증 토큰이있는 경우] 새 인증 토큰을 실제로 제공하고 이전 인증을 무효화 할 수 있습니다.

또한 다른 API 호출마다이 인증 토큰을 보내 인증 된 출처에서 온 것인지 아닌지를 확인할 수 있습니다. 이제 사용자가 응용 프로그램에서 로그 아웃하면 클라이언트 측에서 인증 토큰을 제거하기 만하면됩니다.

다음 번에 사용자가 응용 프로그램으로 돌아 오면 응용 프로그램에 인증 토큰이 없으며 로그인 화면으로 리디렉션 될 수 있습니다.

+0

멋진 것 같습니다! 또한 HttpClient 인증과 함께 인증 토큰을 사용할 수 있습니까? – user2144555

+0

나는 주석에 내 코드를 넣었습니다. ** 인증 토큰 ** 구현에 대한 유용한 정보를 찾을 수 없습니다. ... – user2144555

+0

확인이 링크 : http://stackoverflow.com/questions/14003334/what-is-the-point-of-authentication 토큰 - 온 - 휴무 - 서비스 – Atrix1987

관련 문제