Android 这是使用改装2设置基本身份验证的正确方法吗?

Android 这是使用改装2设置基本身份验证的正确方法吗?,android,retrofit2,basic-authentication,okhttp3,Android,Retrofit2,Basic Authentication,Okhttp3,我正在做一个辅助项目,我只知道我应该使用基本身份验证。由于我没有使用它的经验,我在网上发现了一些东西,我想征求你的意见,这是正确的方法吗 所以,第一件事是从改造的文件: 这是改装(网络)设置: 这是我的专业课: public interface RetrofitService { @GET("login") Call<Void> basicLogin(); @GET("contact") Call<List<Contacts>> getContacts(@

我正在做一个辅助项目,我只知道我应该使用基本身份验证。由于我没有使用它的经验,我在网上发现了一些东西,我想征求你的意见,这是正确的方法吗

所以,第一件事是从改造的文件:

这是改装(网络)设置:

这是我的专业课:

public interface RetrofitService {

@GET("login")
Call<Void> basicLogin();

@GET("contact")
Call<List<Contacts>> getContacts(@Header("Authorization") String authkey);

@GET("product")
Call<List<Products>> getProducts(@Header("Authorization") String authkey);

}
我相信这里没有什么可以改变的。。。因此,首先要做的是登录(检查身份验证),下面是我想知道的两件事:

private void login(final String username, final String password) {
    RetrofitService loginService =
            RetrofitSetup.createService(RetrofitService.class, username, password);
    Call<Void> call = loginService.basicLogin();
    call.enqueue(new Callback<Void>() {
        @Override
        public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
            progressBar.setVisibility(View.GONE);
            if (response.isSuccessful()) {
                // user object available
                editor.putString("username", username);
                editor.putString("password", password);
                editor.apply();
                startActivity(new Intent(LoginActivity.this, MainActivity.class));
                finish();
            } else {
                Toast.makeText(LoginActivity.this, response.message(), Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
            progressBar.setVisibility(View.GONE);
            Toast.makeText(LoginActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}
private void登录(最终字符串用户名、最终字符串密码){
更新服务登录服务=
createService(RefughtService.class、用户名、密码);
Call Call=loginService.basicLogin();
call.enqueue(新回调(){
@凌驾
public void onResponse(@NonNull调用,@NonNull响应){
progressBar.setVisibility(View.GONE);
if(response.issusccessful()){
//可用的用户对象
编辑器.putString(“用户名”,用户名);
编辑器.putString(“密码”,password);
editor.apply();
startActivity(新意图(LoginActivity.this、MainActivity.class));
完成();
}否则{
Toast.makeText(LoginActivity.this,response.message(),Toast.LENGTH_SHORT.show();
}
}
@凌驾
public void onFailure(@NonNull Call Call,@NonNull Throwable t){
progressBar.setVisibility(View.GONE);
Toast.makeText(LoginActivity.this,t.getMessage(),Toast.LENGTH_SHORT.show();
}
});
}
如果响应成功,我将这些凭据保存在SharedReferences中

下一页应该调用另一个请求,所以我想知道如果我同时发送用户名/密码或身份验证密钥是否有任何区别

我就是这样做的:

private void getContacts() {
    prefs = getActivity().getSharedPreferences(KEY, MODE_PRIVATE);
    String username = prefs.getString("username", null);
    String password = prefs.getString("password", null);

    RetrofitService loginService =
            RetrofitSetup.createService(RetrofitService.class, Helper.getAuthToken(username, password));
    Call<List<Contacts>> call = loginService.getContacts(Helper.getAuthToken(username, password));
    call.enqueue(new Callback<List<Contacts>>() {
        @Override
        public void onResponse(@NonNull Call<List<Contacts>> call, @NonNull Response<List<Contacts>> response) {
            if (response.isSuccessful()) {
                kontaktiAdapter.setKontakti(response.body());
            } else {
                Toast.makeText(getActivity(), response.message(), Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(@NonNull Call<List<Contacts>> call, @NonNull Throwable t) {
            Toast.makeText(getActivity(), t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}
private void getContacts(){
prefs=getActivity().getSharedReferences(键,模式\私有);
字符串username=prefs.getString(“username”,null);
字符串密码=prefs.getString(“密码”,null);
更新服务登录服务=
createService(RefughtService.class,Helper.getAuthToken(用户名,密码));
Call Call=loginService.getContacts(Helper.getAuthToken(用户名、密码));
call.enqueue(新回调(){
@凌驾
public void onResponse(@NonNull调用,@NonNull响应){
if(response.issusccessful()){
setKontakti(response.body());
}否则{
Toast.makeText(getActivity(),response.message(),Toast.LENGTH_SHORT.show();
}
}
@凌驾
public void onFailure(@NonNull Call Call,@NonNull Throwable t){
Toast.makeText(getActivity(),t.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
因此,在这个调用中,我不是将用户名/密码发送到regenerateSetup.createService,而是从SharedReferences发送带有用户名和密码的Helper.getAuthToken(用户名,密码)

这样做对吗?如果退出应用程序,我将在登录屏幕中检查SharedReferences是否包含用户名/密码,并尝试使用这些参数登录。。如果我想注销,我会从SharedReferences中清除这些参数,这样下次用户打开应用程序时,SharedReferences将不包含这些参数,所以用户不会登录,他/她必须再次键入这些参数

你对此有什么想法,我有什么不同的想法吗?
问候

这是迄今为止我尝试过的最简单的“基本身份验证”方法

使用以下代码生成auth头(API/存储库类)

将此作为标头传递给webservice调用(API/存储库类)

添加基本标题作为参数(改装Webservice接口类)

@GET(“新闻提要/每日”)
fun getNewsFeed(@Header(“Authorization”)h1:String):调用
对不起,我的代码是用Kotlin编写的,但是可以很容易地翻译成Java

public class Helper {
public static String getAuthToken(String username, String password) {
    byte[] data = new byte[0];
    try {
        data = (username + ":" + password).getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return "Failed to authenticate";
    }
    return "Basic " + Base64.encodeToString(data, Base64.NO_WRAP);
}
}
private void login(final String username, final String password) {
    RetrofitService loginService =
            RetrofitSetup.createService(RetrofitService.class, username, password);
    Call<Void> call = loginService.basicLogin();
    call.enqueue(new Callback<Void>() {
        @Override
        public void onResponse(@NonNull Call<Void> call, @NonNull Response<Void> response) {
            progressBar.setVisibility(View.GONE);
            if (response.isSuccessful()) {
                // user object available
                editor.putString("username", username);
                editor.putString("password", password);
                editor.apply();
                startActivity(new Intent(LoginActivity.this, MainActivity.class));
                finish();
            } else {
                Toast.makeText(LoginActivity.this, response.message(), Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(@NonNull Call<Void> call, @NonNull Throwable t) {
            progressBar.setVisibility(View.GONE);
            Toast.makeText(LoginActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}
private void getContacts() {
    prefs = getActivity().getSharedPreferences(KEY, MODE_PRIVATE);
    String username = prefs.getString("username", null);
    String password = prefs.getString("password", null);

    RetrofitService loginService =
            RetrofitSetup.createService(RetrofitService.class, Helper.getAuthToken(username, password));
    Call<List<Contacts>> call = loginService.getContacts(Helper.getAuthToken(username, password));
    call.enqueue(new Callback<List<Contacts>>() {
        @Override
        public void onResponse(@NonNull Call<List<Contacts>> call, @NonNull Response<List<Contacts>> response) {
            if (response.isSuccessful()) {
                kontaktiAdapter.setKontakti(response.body());
            } else {
                Toast.makeText(getActivity(), response.message(), Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(@NonNull Call<List<Contacts>> call, @NonNull Throwable t) {
            Toast.makeText(getActivity(), t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}
 var basic = Credentials.basic("YOUR_USERNAME", "YOUR_PASSWORD")
 var retrofitCall = myWebservice.getNewsFeed(basic)
 @GET("newsfeed/daily")
 fun getNewsFeed(@Header("Authorization") h1:String):Call<NewsFeedResponse>