Retrofit返回不工作的访问令牌

时间:2018-03-22 09:43:29

标签: android oauth-2.0 retrofit access-token

我正在创建一个授权应用程序,用户在其中注册并获取client_id,client_secret,access_token和refresh_token。我有一个API,我需要打电话。在那个电话中我使用了access_token。一切都很棒。但是access_token在一小时后到期,所以使用refresh_token我更新了我的access_token,但新的access_token不起作用。当我使用这个新的access_token进行调用时,响应正文消息为"expired access_token provided"。在邮递员一切都很好。当我获得新的access_token时,在服务器中只能看到我从注册中获得的access_token。所以在服务器中access_token没有更新。但是当我在邮递员中这样做时,服务器中的access_token会发生变化。那么问题是什么,在邮递员中他更新了access_token,而在服务器中access_token发生了变化,但是当我在电话中更新时,服务器中的access_token不会改变。我做了调试,我发现我正在获得新的access_token。那么问题出在哪里?

public interface SupportopApi {

//Post request for user register
@POST("/api/registration")
Call<ResponseBody> registrationRequest(@Body SupportopObjRegistration supportopObjRegistration);

//Post request for user activation
@POST("/api/getClientCD")
Call<ResponseBody> clientActivationRequest(@Body SupportopObjClient activate);

//Get request for getting token
@GET("/api/getToken")
Call<ResponseBody> getTokenRequest(@Query("grant_type") String grant_type,
                            @Query("client_id") String client_id,
                            @Query("client_secret") String client_secret,
                            @Query("email") String email,
                            @Query("password") String password);

//The call where i use my access_token

    @GET("/api/getLanguages")
    Call<ResponseBody> getLanguages(@Header("Content-Type") String json,
                                    @Header("Authorization") String token,
                                    @Header("Cache-Control") String cache);}

这里是改造和OkHttpClient初始化部分。

public class ApiClient {

private static ApiClient instance;

private SupportopApi supportopApi;

    client.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(@NonNull Chain chain) throws IOException {
            Request request = chain.request();
            request = request.newBuilder()
                    .build();
            return chain.proceed(request);
        }
    });

    supportopApi = new Retrofit.Builder()
            .baseUrl(endpoint)
            .client(client.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(SupportopApi.class);
}

public static synchronized void initializeInstance(String endpoint) {
    if (instance == null) {
        instance = new ApiClient(endpoint);
    }
}


public static synchronized ApiClient getInstance() {
    if (instance == null) {
        throw new IllegalStateException("PentairAPIClient has not been initialized.");
    }
    return instance;
}


public Call<ResponseBody> registration(SupportopObjRegistration supportopObjRegistration) {
    return supportopApi.registrationRequest(supportopObjRegistration);
}


public Call<ResponseBody> activation(SupportopObjClient activate) {
    return supportopApi.clientActivationRequest(activate);
}


public Call<ResponseBody> getToken(String grant_type, String client_id, String client_secret,
                                   String email, String password) {
    return supportopApi.getTokenRequest(grant_type, client_id, client_secret, email, password);
}


public Call<ResponseBody> getLanguage(String token) {
    String new_token = "Bearer " + token;
    return supportopApi.getLanguages("application/json", new_token, "no-cache");
}

}

注册效果很好,所以我只会向您显示登录电话。

public class LoginFragment extends BaseFragment {
private View mainView;

private ApiClient apiClient;
private EditText email, password;
private Button userLogin;

private SupportopObjClient supportopClientActivate;

@Override
public String toString() {
    return "LoginFragment";
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mainView = inflater.inflate(R.layout.login_fragment, container, false);
    init(mainView);

    return mainView;
}

private void init(final View v) {
    apiClient = ApiClient.getInstance();

    email = (EditText) v.findViewById(R.id.login_email);
    password = (EditText) v.findViewById(R.id.login_password);
    userLogin = (Button) v.findViewById(R.id.user_login);

    userLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            supportopClientActivate.setUsername("");
            supportopClientActivate.setEmail(email.getText().toString());
            supportopClientActivate.setPassword(password.getText().toString());
            supportopClientActivate.setType("generic");

            getClient();
        }
    });
}

public void getClient() {
    Call<ResponseBody> callActive = apiClient.activation(supportopClientActivate);
    callActive.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

            if (response.isSuccessful()) {

                try {

                    //Parsing the data from Json to string

                    String data = response.body().string();
                    JSONObject obj = new JSONObject(data);

                    String client_id = obj.getString("client_id");
                    String client_secret = obj.getString("client_secret");

                    //Saving clientID and clientSecret in phone storage
                    SharedPreferencesManager.getInstance().setClientID(client_id);
                    SharedPreferencesManager.getInstance().setClientSecret(client_secret);

                    //Calling the tokenCall method to get access token and refresh token

                    loginCall(client_id, client_secret);

                } catch (JSONException | IOException e) {
                    e.printStackTrace();
                }

            } else {
                //if the response not successful
                Toast.makeText(getActivity(), "user doesn't exist", Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Toast.makeText(getActivity(), "An error occurred", Toast.LENGTH_SHORT).show();
        }
    });
}

public void loginCall(String client_id, final String client_secret) {
    Call<ResponseBody> token = apiClient.getToken("password", client_id, client_secret,
            supportopClientActivate.getEmail(), supportopClientActivate.getPassword());

    token.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                try {

                    //Parsing the data from Json to string

                    String dataAccess = response.body().string();
                    JSONObject obj = new JSONObject(dataAccess);

                    String access_token = obj.getString("accessToken");
                    String refresh_token = obj.getString("refreshToken");

                    Toast.makeText(context, access_token, Toast.LENGTH_SHORT).show();

                    SharedPreferencesManager.getInstance().setAccessToken(access_token);
                    SharedPreferencesManager.getInstance().setRefreshToken(refresh_token);

                    Toast.makeText(context, SharedPreferencesManager.getInstance().getAccessToken(), Toast.LENGTH_SHORT).show();
                } catch (IOException | JSONException e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(getActivity(), "password or email are incorrect or doesn't exist",
                        Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Toast.makeText(getActivity(), "An error occurred", Toast.LENGTH_SHORT).show();
        }
    });

}

0 个答案:

没有答案