改装2:如何使授权令牌头动态



我正在创建一个应用程序,允许用户使用基本身份验证登录。

我有一个改装客户端,它使用拦截器来获取令牌。然而,只有当您将电子邮件和密码指定为字符串,而不是基于用户在登录表单中输入的电子邮件和密码时,它才有效。

在我拥有的代码中,我将凭据设置为电子邮件="email@test.com"和password="test",代码工作,用户可以登录。

但是,我需要AUTH变量是动态的。我看到的所有例子和问题都有一个使用静态电子邮件和密码的解决方案。

我的改装客户是这个

public class RetrofitClient {
private static final String BASE_URL = "http://999.999.999:9999/api/";
private static RetrofitClient mInstance;
private Retrofit retrofit;
private static final String AUTH =
Credentials.basic("email@test.com", "test");

private RetrofitClient(){
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(
new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder()
.addHeader("Authorization", AUTH)
.method(original.method(), original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
}
).build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
}
public static synchronized RetrofitClient getInstance() {
if (mInstance == null) {
mInstance = new RetrofitClient();
}
return mInstance;
}

public Api getApi(){
return retrofit.create(Api.class);
}
}

我怎么称呼客户是这个

Call<LoginResponse> call = RetrofitClient
.getInstance()
.getApi()
.userLogin(email, password);

call.enqueue(new Callback<LoginResponse>() {
@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
LoginResponse loginResponse = response.body();
if(response.code() == 200){
//save user
//open profile
Toast.makeText(LoginActivity.this, loginResponse.getToken(), Toast.LENGTH_SHORT).show();
} else {

Toast.makeText(LoginActivity.this, "Error Logging in", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<LoginResponse> call, Throwable t) {
}
});

实际上,您唯一需要做的就是用其他数据源替换AUTH,这些数据源可以从代码中需要的任何部分更改

解释 intercept方法会在每个api请求上调用,因此您的凭据可以随时更改


例如

一些单例凭据提供商

public class CredentialsProvider {
//Some singleton stuff
private Credentials credentials = Credentials.basic("email@test.com", "test"); //Some initial data
public void setCredentials(Credentials credentials) {
this.credentials = credentials
}
public Credentials getCredentials() {
return credentials;
}

代码中要更改凭据的位置

{
CredentialsProvider.getInstance().setCredentials(someNewCredentials);
}

改装

public class RetrofitClient {
//Your code
private CredentialsProvider credentialsProvider;
// More code
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder()
.addHeader("Authorization", credentialsProvider.getCredentials())
.method(original.method(), original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
}

最新更新