Проблема в авторизации яндекс диск с помощью retrofit2

112
02 сентября 2019, 18:20

Изучаю Retrofit2, пытаюсь получить токен Yandex disk, в документации яндекса написано, чтобы получить токен необходимо для начала подтвердить разрешения пользователя и получить код. В документации об этом написано:

Получение токена в обмен на код, извлеченный из URL:

Приложение направляет пользователя на страницу Яндекс.OAuth, где он может разрешить доступ к своим данным.

Пользователь разрешает доступ приложению.

Яндекс.OAuth перенаправляет пользователя на адрес, указанный в поле Callback URL при регистрации приложения. Код подтверждения (или описание ошибки) передается в параметре URL перенаправления.

Приложение получает адрес перенаправления и извлекает код подтверждения.

Приложение отправляет POST-запрос с кодом.

Яндекс.OAuth возвращает токен в теле ответа.

Получаю код так:

Имеется сервис, создающий синглтоном экземпляр ретрофита. В странном методе пук:) получаю этот самый код:

public class NetworkService {
    private static NetworkService mInstance;
    private static final String BASE_URL = "https://oauth.yandex.ru";
    private Retrofit mRetrofit;
    private static final String ID = "здесь мой id";
    private static final String PASSWORD = "здесь мой пароль";
    private static final String CALLBACK_URI = "здесь колбэк";
    private NetworkService() {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        OkHttpClient.Builder client = new OkHttpClient.Builder()
                .addInterceptor(interceptor);
        mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client.build())
                .build();
    }
    public static NetworkService getInstance() {
        if (mInstance == null) {
            mInstance = new NetworkService();
        }
        return mInstance;
    }
    public ApiService getJSONApi() {
        return mRetrofit.create(ApiService.class);
    }

    public static void puk() {
        Call<AccessCodeYandex> call = NetworkService.getInstance().getJSONApi().getToken( ID);
        call.enqueue(new Callback<AccessCodeYandex>() {
            @Override
            public void onResponse(Call<AccessCodeYandex> call, Response<AccessCodeYandex> response) {
                System.out.println();
            }
            @Override
            public void onFailure(Call<AccessCodeYandex> call, Throwable t) {
                System.out.println();
            }
        });
    }
}

Интерфейс для rest запросов:

public interface ApiService {
    @POST("/authorize?response_type=code")
    @FormUrlEncoded
    Call<AccessCodeYandex> getToken1(@Field("client_id") String client_id);
}

Ну и модель для возврата ответа:

@NoArgsConstructor
@Getter
@Setter
public class AccessCodeYandex {
    @SerializedName("code")
    @Expose
    private String code;
    @SerializedName("state")
    @Expose
    private String state;
}

Попадаю в Failure с ошибкой:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

Вот так запускаю страницу для подтверждения. Как сделать ридерект с полученным кодом в приложение?

 private void getView() {
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Title here");
        WebView wv = new WebView(this);
        wv.loadUrl("https://oauth.yandex.ru/authorize?response_type=code&client_id=мой айди");
        wv.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        alert.setView(wv);
        alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                dialog.dismiss();
            }
        });
        alert.show();
    }
READ ALSO
Адаптивные ImageView в Android

Адаптивные ImageView в Android

В разметке активити есть область, в которой должны поместиться изображения(от 1 до 10)Соответственно они должны заполнять всю эту область...

113
Размеры элементов для разных экранов

Размеры элементов для разных экранов

Заметил что с размерами экрана на телефонах творится что-то непонятноеРешил проверить - создал 3 блока шириной 1080px, 967px(подобрал для своего...

107
Чем зашифрован этот js?

Чем зашифрован этот js?

Вот такой код попал ко мне в руки, и я не пойму, во-первых, что это, во-вторых, как превратить это в понятный вид:

116
Проблема с сборкой css в webpack

Проблема с сборкой css в webpack

Пытаюсь настроить webpack для разработки приложения на vueКогда делаю сборку приложения все стили в компонентах и sсss файлах, которые написал...

107