OAuth2 Модифицированный токен доступа - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь создать мобильное приложение, которое входит в систему, используя OAuth2. Я следую этому уроку здесь , но изменил некоторые его части.

Краткое описание моей проблемы:

  1. Я получаю токен доступа = null при отладкеприложение. Как я могу получить токен доступа?
  2. Когда я начинаю отлаживать приложение, я получаю сообщение об ошибке «Произошла ошибка с AuthCode», но приложение продолжает работать, поэтому я не уверен, что там что-то не так. Это проблема?
  3. В LoginActivity.java я попытался изменить LoginService loginService = ServiceGenerator.createService(LoginService.class, clientId, clientSecret); на LoginService loginService = ServiceGenerator.createService(LoginService.class, code);, что на самом деле ничего не изменило. Должно ли это иметь значение?

ServiceGenerator.java:

public class ServiceGenerator {
public static final String API_BASE_URL = "http://xxxx";
private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create());

/*public static <S> S createService(Class<S> serviceClass) {
    return createService(serviceClass, null);
}*/

public static <S> S createService(Class<S> serviceClass, String clientId, String clientSecret) {
    if (!TextUtils.isEmpty(clientId)
            && !TextUtils.isEmpty(clientSecret)) {
        String authToken = Credentials.basic(clientId, clientSecret);
        return createService(serviceClass, authToken);
    }
    return createService(serviceClass, null, null);
}

private static Retrofit retrofit;
public static <S> S createService(Class<S> serviceClass, final String authToken) {

    if (!TextUtils.isEmpty(authToken)) {
        AuthenticationInterceptor interceptor = new AuthenticationInterceptor(authToken);

        if (!httpClient.interceptors().contains(interceptor)) {
            httpClient.addInterceptor(interceptor);
            builder.client(httpClient.build());
            retrofit = builder.build();
        }}
    return retrofit.create(serviceClass);
}}

Файл AccessToken.java выглядит следующим образом. Видимо, accessToken не назначен.

public class AccessToken {
private String accessToken;
private String tokenType;

public String getAccessToken() {
    return accessToken;
}

public String getTokenType() {
    if (!Character.isUpperCase(tokenType.charAt(0))) {
        tokenType = Character
                .toString(tokenType.charAt(0))
                .toUpperCase() + tokenType.substring(1);
    }
    return tokenType;
}}

AuthenticationInterceptor.java:

public class AuthenticationInterceptor implements Interceptor {
private String authToken;
public AuthenticationInterceptor(String token) {
    this.authToken = token;
}

@Override
public Response intercept(Chain chain) throws IOException {
    Request original = chain.request();

    Request.Builder builder = original.newBuilder()
            .header("Authorization", authToken);

    Request request = builder.build();
    return chain.proceed(request);
}}

LoginService:

@Headers("Accept: application/json")
@FormUrlEncoded
@POST("/oauth/token")
Call<AccessToken> getAccessToken(
        @Field("code") String code,
        @Field("grant_type") String authorization_code,
        @Field("client_id") String clientId,
        @Field("client_secret") String clientSecret,
        @Field("redirect_Uri") String redirectUri);
//Call<AccessToken> getAccessToken(String code, String authorization_code);}

И вторая часть моей LoginActivity. java:

@Override
protected void onResume() {
    super.onResume();

    Uri uri = getIntent().getData();
    if (uri != null && uri.toString().startsWith(redirectUri)){
        new AsyncTaskRunner().execute();
    } else {
        Log.e("Error", "Error has occurred with AuthCode");
    }
}

public class AsyncTaskRunner extends AsyncTask<String,String,String> {
    @Override
    protected String doInBackground(String... strings) {
        Uri uri = getIntent().getData();
        if (uri != null && uri.toString().startsWith(redirectUri)) {
            String code = uri.getQueryParameter("code");
            if (code != null) {
                LoginService loginService = ServiceGenerator.createService(LoginService.class, clientId, clientSecret);
                Call<AccessToken> call = loginService.getAccessToken(code, "authorization_code", clientId, clientSecret, redirectUri);
                try {
                    accessToken = call.execute().body();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        Log.d("Tag", accessToken.toString());
        return String.valueOf(accessToken);
    }

Я новичок в этом деле, поэтому любое объяснение будет с благодарностью! Мне известны другие сообщения, в которых задавались похожие вопросы, но я не могу оставлять комментарии, чтобы задавать вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...