2016-09-04 10 views
0

私は新しいプログラマです。トークンベースの認可のためにアンドロイドでRetrofitを使用したいと思っていたので、チュートリアル(https://www.sitepoint.com/retrofit-a-simple-http-client-for-android-and-java/)に従いました。チュートリアルはPHPサーバでした)。しかし、私はトークンがプログラムにどこに保存されているのか、それをどうやって入手するのか分かりません。それは単にアンドロイドコンソールに表示されます。私は私のアンドロイドプログラムでトークンを解読する必要があります。しかし、トークンはAndroidのコンソールに表示されます。更新:トークンを取得するにはどうすればいいですか?

com.example.programmingknowledge.login D/Retrofit: {"auth_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJuYW1lIjpudWxsLCJlbWFpbCI6ImV4YW1wbGVAbWFpbC5jb20iLCJleHAiOjE0NzMwMzU1MTF9.bhJABvEgtRISZVJ0DejjEtrGJyXzNV6PO0YGQ71xHRc"} 

アンドロイドアプリでトークンを取得するにはどうすればよいですか?何か案が?ここで

は私のインタフェースである:ここでは

public interface Interface { 

     //This method is used for "POST" 
     @FormUrlEncoded 
     //@POST("/api.php") 
     @POST("/") 
     void postData(@Field("method") String method, 
         @Field("email") String username, 
         @Field("password") String password, 
         Callback<ServerResponse> serverResponseCallback); 

     //This method is used for "GET" 
     //@GET("/api.php") 
     @GET("/") 
     void getData(@Query("method") String method, 
        @Query("email") String username, 
        @Query("password") String password, 
        Callback<ServerResponse> serverResponseCallback); 

    } 

は私が使用コミュニケータ(メソッドで更新)からのコードです:

import android.util.Log; 

import com.squareup.otto.Produce; 

import retrofit.Callback; 
import retrofit.RestAdapter; 
import retrofit.RetrofitError; 
import retrofit.client.Response; 


public class Communicator { 
    private static final String TAG = "Communicator"; 
    private static final String SERVER_URL = "http://10.0.2.2:3000/authenticate"; 

    public void loginPost(String email, String password){ 


     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(SERVER_URL) 
       .setLogLevel(RestAdapter.LogLevel.FULL) 
       .build(); 
     Interface communicatorInterface = restAdapter.create(Interface.class); 

//HERE I PLACED THE METHOD, BUT HOW CAN I GET THE AUTH-TOKEN WITH THIS METHOD? I want to save it somewhere 
     communicatorInterface = ServiceGenerator.createService(Interface.class, "auth-token"); 




     Callback<ServerResponse> callback = new Callback<ServerResponse>() { 
      @Override 
      public void success(ServerResponse serverResponse, Response response2) { 
       if(serverResponse.getResponseCode() == 0){ 
        BusProvider.getInstance().post(produceServerEvent(serverResponse)); 
       }else{ 
        BusProvider.getInstance().post(produceErrorEvent(serverResponse.getResponseCode(), serverResponse.getMessage())); 
       } 

      } 

      @Override 
      public void failure(RetrofitError error) { 
       if(error != null){ 
        Log.e(TAG, error.getMessage()); 
        error.printStackTrace(); 
       } 
       BusProvider.getInstance().post(produceErrorEvent(-200,error.getMessage())); 
      } 
     }; 
     communicatorInterface.postData("login", email, password, callback); 

    } 


    public void loginGet(String email, String password){ 
     RestAdapter restAdapter = new RestAdapter.Builder() 
       .setEndpoint(SERVER_URL) 
       .setLogLevel(RestAdapter.LogLevel.FULL) 
       .build(); 
     Interface communicatorInterface = restAdapter.create(Interface.class); 
     Callback<ServerResponse> callback = new Callback<ServerResponse>() { 
      @Override 
      public void success(ServerResponse serverResponse, Response response2) { 
       if(serverResponse.getResponseCode() == 0){ 
        BusProvider.getInstance().post(produceServerEvent(serverResponse)); 
       }else{ 
        BusProvider.getInstance().post(produceErrorEvent(serverResponse.getResponseCode(), serverResponse.getMessage())); 
       } 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       if(error != null){ 
        Log.e(TAG, error.getMessage()); 
        error.printStackTrace(); 
       } 
       BusProvider.getInstance().post(produceErrorEvent(-200,error.getMessage())); 
      } 
     }; 
     communicatorInterface.getData("login", email, password, callback); 

    } 

    @Produce 
    public ServerEvent produceServerEvent(ServerResponse serverResponse) { 
     return new ServerEvent(serverResponse); 
    } 

    @Produce 
    public ErrorEvent produceErrorEvent(int errorCode, String errorMsg) { 
     return new ErrorEvent(errorCode, errorMsg); 
    } 
} 

そして、ここでは私のServiceGeneratorクラスは

public class ServiceGenerator { 

    public static final String API_BASE_URL = "https://your.api-base.url"; 

    private static RestAdapter.Builder builder = new RestAdapter.Builder() 
      .setEndpoint(API_BASE_URL) 
      .setClient(new OkClient(new OkHttpClient())); 

    public static <S> S createService(Class<S> serviceClass) { 
     return createService(serviceClass, null); 
    } 

    public static <S> S createService(Class<S> serviceClass, final String authToken) { 
     if (authToken != null) { 
      builder.setRequestInterceptor(new RequestInterceptor() { 
       @Override 
       public void intercept(RequestFacade request) { 
        request.addHeader("Authorization", authToken); 
       } 
      }); 
     } 

     RestAdapter adapter = builder.build(); 
     return adapter.create(serviceClass); 
    } 
} 

答えて

0
です

チュートリアルをご覧ください:https://futurestud.io/blog/retrofit-token-authentication-on-android

そして、そのような行に行く:あなたが見ることができるように、トークンがサーバーから返されたJSONの結果がサーバから返された public static <S> S createService(Class<S> serviceClass, final String authToken) {

+0

ありがとうございます。このメソッドを呼び出しますか?私は自分の投稿にコミュニケータコードを掲載しました。どこか? – Peter

+0

メソッドをクラスに配置するだけで、ログイン後にauthorizatizingすることで呼び出されます。 – machei

+0

hm私はそれを取得しない、このメソッドは何も戻って、どのように私はこのトークンを取得できますか?私の投稿のupdateを参照してください。createServiceメソッドを配置しました – Peter

0

改造ログは... あなただけit.itはにする必要があります取得する必要がありますServerResponseオブジェクト(パラメータの名前を正しく指定した場合)レスポンスボディを静的変数などに保存してcreateServiceメソッドで使用します

関連する問題