2015-11-04 10 views
14

私はアンドロイドアプリを使用して改装2を使用しています。私のREST APIはすべてLiferayで書かれています。今Liferayでは、私が最初に認証する必要のあるWebサービスにアクセスすることがわかりました。だから私はこのレトロフィットが動作していないことを使用してアンドロイドからレストウェブサービス経由でログイン

http://test:[email protected]:8080/liferay-portlet/api/secure/jsonws/ 

のように認証したLiferayのは、私たちがoverridden.IはポストマンからのWebサービスの呼び出しにその作業罰金をチェックして独自のユーザー認証方法があります。

URL:http://test:[email protected]:8080/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name 

形式でエンコードされた値

companyId:10154 
screenName:xyz 
password:xyz 
active:true 

私は郵便配達にこれを置く場合、それは適切にJSONレスポンスをフェッチします。

私がアンドロイドコードから同じものを呼び出すと、私は応答が "無許可"になります。

私のレトロフィットサービス

public interface LoginApi {  
    @FormUrlEncoded 
    @POST("/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name") 
    Call<User> login(@Field("companyId")long companyId,@Field("screenName")String screenName,@Field("password")String password,@Field("active")boolean active); 
} 

マイRestApiManagerクラス(このクラスは、サービス・インターフェースを呼び出し、改造ビルダーを作成するために使用される)

public class RestApiManager { 

    private LoginApi loginApi; 

    public LoginApi login() { 
     if (loginApi==null) { 
      GsonBuilder gson=new GsonBuilder(); 
      gson.registerTypeAdapter(String.class, new StringDeserializer()); 
      Retrofit retrofit=new Retrofit.Builder() 
       .baseUrl("http://test:[email protected]:8080") 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 
      loginApi=retrofit.create(LoginApi.class); 
    } 
    return loginApi; 
} 

RestApiManager

Call<User> callUser=restApiManager.login().login(loginData.getCompanyId(),loginData.getScreenName(),loginData.getPassword(),loginData.isActive()); 
callUser.enqueue(new Callback<User>() { 
    @Override 
    public void onResponse(Response<User> response, Retrofit retrofit) { 
     Log.d("Login","Login Response:"+response.body()); 
    } 

    @Override 
    public void onFailure(Throwable t) { 
     Log.d("Login","Login Response:"+t.getMessage()); 
    } 
}); 
への呼び出し
+1

どのような応答ですか?どのコールバックが呼び出されますか? – Blackbelt

+0

あなたはLogginを置くべきです –

答えて

1

クロスプラットフォームでのセッション管理は、ブラウザでの動作とは異なります。 Postmanは、ブラウザプラットフォーム上で動作するWebクライアントです。

1. 1つの解決策は、デバイス上でクッキーを維持することです。

この回答を確認してくださいmanage sessions with Android Application

2.もう1つの解決策は、Json Web Tokenベースの認証を使用することです。

5

リクエストにPOST変数の代わりにJSON本体が必要なようですね。あなたはJSON Webサービスを呼び出しており、サンプルパラメータはPOSTよりもJSONの方が多く見えます。もしそうなら、あなたはオブジェクトであなたのパラメーターをカプセル化することができます - 私が試した

User user = new User(loginData.getCompanyId(),loginData.getScreenName(),loginData.getPassword(),loginData.isActive()); 
Call<User> callUser = restApiManager.login().login(user); 
1

-

public interface LoginApi {  
    @POST("/liferay-portlet/api/secure/jsonws/customuserauthentication/authenticate-by-user-name") 
    Call<User> login(@Body User user); 
} 

として、あなたの呼び出しを構築 -

public class User { 
    int companyId; 
    String screenName; 
    String password; 
    boolean active; 

    User(int companyId, String screenName, String password, boolean active) { 
     this.companyId = companyId; 
     this.screenName = screenName; 
     this.password = password; 
     this.active = active; 
} 

あなたのインターフェイスは次のようになります私のローカルPCでデモコードを実行するために、あなたのサーバーがローカルエリアネットワークにあるとは幸運なことではありません。この質問については、サーバー側でcookieまたはセッションを使用している場合は、setCookieあなたはあなたのレトロフィットAPIが構築された要求を正確に知らなくてもあなたを助けるために私たちには難しいかもしれhere

private PersistentCookieStore cookieStore= new PersistentCookieStore(JApplication.getInstance().getApplicationContext()); 
CookieManager cookieManager = (new CookieManager(
      cookieStore, 
      CookiePolicy.ACCEPT_ALL)); 

okHttpClient.setCookieHandler(cookieManager); 
OkClient okClient = new OkClient(okHttpClient); 
RestAdapter restAdapter = new RestAdapter.Builder() 
      .setRequestInterceptor(new RequestInterceptor() { 
       @Override 
       public void intercept(RequestFacade request) { 
        request.addHeader(Constant.Header_UserAgent, getUserAgent()); 
       } 
      }) 
      .setClient(okClient) 
      .setEndpoint(URL) 
      .setErrorHandler(new HttpErrorHandler()) 
      .setConverter(new GsonConverter(gson)) 
      .build(); 
1

を見つけることができ、PersistentCookieStore.javaを次のようにハンドラ。

Logging Interceptorを設定して、実際に何が起きているのかまだ分かっていない場合は、さらに詳しい情報を返すことができます。

チェックレトロフィット2とLoggingInterceptorを設定する方法を発見するには、この答え: Logging with Retrofit 2

ことができますことを願っています。

よろしくお願いいたします。

0

私はここで与えられたすべてのソリューションを試しましたが、残念ながら何も働いていませんでした。私がアンドロイド内からライフサービスを呼び出すために見つけた唯一の解決策は、liferモバイルsdkを使用することです。詳細は Liferay Mobile SDK

関連する問題