【问题标题】:Retrofit: how can I get the token改造:如何获得令牌
【发布时间】:2016-09-05 19:00:37
【问题描述】:

我是一名新程序员,我想在 android 中使用 Retrofit 进行基于令牌的授权。因此我遵循了一个教程 (https://www.sitepoint.com/retrofit-a-simple-http-client-for-android-and-java/) 并将其改编为我在 Rails 服务器上的 ruby​​(在教程中它是一个 php-服务器)。但是我不知道令牌在程序中的保存位置或如何获取它。它只出现在 android 控制台中。我需要在我的 android 程序中解码令牌。但是令牌只出现在我的 android 控制台中:

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

如何在我的 Android 应用程序中获取令牌?任何想法?

这是我的界面:

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);
    }
}

【问题讨论】:

    标签: android retrofit access-token


    【解决方案1】:

    看教程:https://futurestud.io/blog/retrofit-token-authentication-on-android

    然后像这样去一行: public static <S> S createService(Class<S> serviceClass, final String authToken) {

    【讨论】:

    • 谢谢,但是在我的代码中,我可以在哪里调用这个方法?我在帖子中发布了通信器代码。在哪里?
    • 只需将方法放入您的类中,这些方法将在登录后通过授权调用。
    • hm 我不明白,这个方法没有返回任何东西,我怎样才能得到这个令牌?请参阅我放置方法 createService 的帖子中的更新
    • 我只想在我的代码中这样:String auth_token = ..................然后我可以解码(auth_token)。但我不知道如何使用以下方法做到这一点: public static S createService(Class serviceClass, final String authToken) {
    【解决方案2】:

    retrofit 记录从服务器返回的 json 结果... 如您所见,令牌已从服务器返回,您只需要获取它。它应该在 ServerResponse 对象中(如果您正确命名参数)您可以通过获取 response body 来获取令牌。just将其保存在静态变量或其他东西中,然后在您的 createService 方法中使用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2019-10-25
      • 2018-10-07
      • 2013-05-05
      • 2021-10-01
      相关资源
      最近更新 更多