首页 > 解决方案 > Github Basic Auth with username+password+code using Retrofit Android

问题描述

我正在尝试制作一个应用程序,该应用程序将通过 github REST API 列出用户的所有 github 存储库公共/私有。

这是用于改造的 GithubService。

public interface GithubService {
@GET("user")
Call<User> getUser(@Header("Authorization") String authHeader);

@GET("users/{user}/repos")
Call<List<GitHubRepo>> userRepos(@Header("Authorization") String authHeader, @Path("user") String userId);}

我有一个登录表单,其中包含用户名和用户的个人访问令牌作为密码,这是我用于请求用户信息的代码,它返回有效的用户信息:

OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
            .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));

    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl("https://api.github.com")
            .client(clientBuilder.build())
            .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.build();
    GithubService service = retrofit.create(GithubService.class);
    String cred = Credentials.basic(username, password);

    service.getUser(cred).enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            Log.d(TAG, "onResponse: " + response.isSuccessful());
            fetchRepos(password, response.body());
        }

        @Override
        public void onFailure(Call<User> call, Throwable t) {
            Log.d(TAG, "onFailure: " + t.getMessage());
        }
    });

在 fetchRepos 中,我尝试使用个人访问令牌作为 auth 标头来请求用户 repos,但它返回 null,这是代码:

private void fetchRepos(String pat, User user) {
    OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
            .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));

    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl("https://api.github.com")
            .client(clientBuilder.build())
            .addConverterFactory(GsonConverterFactory.create());

    Retrofit retrofit = builder.build();
    GithubService service = retrofit.create(GithubService.class);

    service.userRepos(pat, user.getLogin()).enqueue(new Callback<List<GitHubRepo>>() {
        @Override
        public void onResponse(Call<List<GitHubRepo>> call, Response<List<GitHubRepo>> response) {
            Log.d(TAG, "onResponse: " + response.isSuccessful());
        }

        @Override
        public void onFailure(Call<List<GitHubRepo>> call, Throwable t) {

        }
    });
}

我在这里错在哪里?如何继续授权请求用户回购以及如何将两因素代码集成到授权中?

标签: androidretrofitretrofit2github-api

解决方案


推荐阅读