RedDit oAuth 2 para Android aplicación "sin usuario" con Retrofit

Estoy tratando de implementar el RedDit oAuth2 (cada aplicación que utiliza el contenido de Reddit tiene que tener esta implementada ) en la aplicación basada en Android "sin usuarios" y estoy siguiendo las directrices.

  1. He registrado una aplicación y obtengo el respectivo client_id .
  2. Estoy siguiendo esto para las directrices de la API y esto para Retrofit para escribir correctamente el código de Android.

Por lo tanto, he codificado dos enfoques de la cuestión y parece que no funciona. La llamada en el Fragmento apropiado es la misma para las dos opciones y va como sigue:

  public void oAuth(){ String bodyString = "grant_type=" + "https://oauth.reddit.com/grants/installed_client" + "&device_id=" + UUID.randomUUID().toString(); TypedInput requestBody = new TypedByteArray("application/x-www-form-urlencoded", bodyString.getBytes(Charset.forName("UTF-8"))); RedditAPI.sRedditAuth().redditAuth(requestBody, new Callback<TokenResponse>() { @Override public void success(TokenResponse tokenResponse, Response response) { Log.d("OATH_TAG", "oAuth() | YAY! :)"); } @Override public void failure(RetrofitError error) { Log.d("OATH_TAG", "oAuth() | NOOOOOoooooo.... :("); } }); } 

OPCIÓN 1:

  • La interfaz de Retrofit:

      public interface RedditAuthInterface { @POST(Urlz.REDDIT_OATH2_PATH) void redditAuth(@Body TypedInput body, Callback<TokenResponse> result); } //the adapter public static RedditAuthInterface sRedditAuth() { if (sRedditAuthInterface == null) { RestAdapter restAdapter = new RestAdapter .Builder() .setClient(getAuthClient()) .setEndpoint(Urlz.BASE_REDDIT_URL) .build(); sRedditAuthInterface = restAdapter.create(RedditAuthInterface.class); } return sRedditAuthInterface; } /* support methods */ private static OkClient getAuthClient() { final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(Static.READ_TIMEOUT, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(Static.CONNECT_TIMEOUT, TimeUnit.SECONDS); /*okHttpClient.setAuthenticator(new Authenticator() { @Override public Request authenticate(Proxy proxy, Response response) throws IOException { String credential = Credentials.basic(BldCnfg.REDDIT_CLIENT_ID, BldCnfg.REDDIT_PASS); return response.request().newBuilder().header("Authorization", credential).build(); } @Override public Request authenticateProxy(Proxy proxy, Response response) throws IOException { return null; } });*/ okHttpClient.networkInterceptors().add(OAUTH_INTERCEPTOR); return new OkClient(okHttpClient); } private static final Interceptor OAUTH_INTERCEPTOR = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response originalResponse = chain.proceed(chain.request()); String credentials = BldCnfg.REDDIT_CLIENT_ID + ":" + BldCnfg.REDDIT_PASS; // REDDIT_PASS = "" as by API guides String string = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); originalResponse.header("Authorization", string); originalResponse.header("Accept", "application/json"); return originalResponse; } }; 
  • resultado:

RetrofitError: 401 no autorizado

OPCION 2:

  • La interfaz de Retrofit:

      public interface RedditAuthInterface { @POST(Urlz.REDDIT_OATH2_PATH) void redditAuth(@Body TypedInput body, Callback<TokenResponse> result); } //the adapter public static RedditAuthInterface sRedditAuth() { if (sRedditAuthInterface == null) { RestAdapter restAdapter = new RestAdapter .Builder() .setClient(getConfuguredClient()) .setRequestInterceptor(getRequestInerceptorPass()) .setEndpoint(Urlz.BASE_REDDIT_URL) .build(); sRedditAuthInterface = restAdapter.create(RedditAuthInterface.class); } return sRedditAuthInterface; } /* support methods */ public static RequestInterceptor getRequestInerceptorPass() { RequestInterceptor rqInter = new RequestInterceptor() { @Override public void intercept(RequestFacade request) { String credentials = BldCnfg.REDDIT_CLIENT_ID + ":" + BldCnfg.REDDIT_PASS; // REDDIT_PASS = "" as by API guides String string = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); request.addHeader("Authorization", string); request.addHeader("Accept", "application/json"); } }; return rqInter; } private static OkClient getConfuguredClient() { final OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(Static.READ_TIMEOUT, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(Static.CONNECT_TIMEOUT, TimeUnit.SECONDS); return new OkClient(okHttpClient); } 
  • resultado:

Parece que estoy recibiendo una respuesta vacía (solo obtengo "*" por alcance). La respuesta correcta tiene este aspecto:

Introduzca aquí la descripción de la imagen

Y encabezado como este:

Introduzca aquí la descripción de la imagen

¿Tienes alguna idea de lo que estoy haciendo mal? ¿Alguien ha hecho esto?

El wiki oficial de Reddit github carece de ejemplos de Android (en casi todos los demás idiomas, sin embargo).

Yo estaba pasando por el mismo problema antes y hacer esta biblioteca para handel OAuth2 en Android. Y la biblioteca es una extensión para Retrofit que simplifica el proceso de autenticación contra un proveedor OAuth 2.

Sobre la base de su imagen con la respuesta "vacía", mostrando que tiene * volver como un ámbito, sospecho que su definición de la respuesta de token de acceso está usando la caja de camello en lugar de la caja de serpiente, por lo que el JSON no se carga correctamente en la Objeto Java.

  • EOFException en Retrofit al ejecutar peticiones PUT síncronas
  • Cómo poner en cola las llamadas de la API cuando no está conectado mientras usa Retrofit
  • AWS S3 Rest API con Android Retrofit V2 biblioteca, la imagen cargada está dañada
  • Javax.net.ssl.SSLException: Error de lectura: ssl = 0x9524b800: Error de E / S durante la llamada al sistema, Conexión restablecida por pares
  • Android: Sondeo de un servidor con Retrofit
  • Cómo deshabilitar / activar jackson SerializationFeature.WRAP_ROOT_VALUE?
  • Cómo manejar el `IllegalArgumentException` en RxJava?
  • Android: agregando imagen al tweet usando la API REST de tela, Twitter y Retrofit
  • No se puede crear un conversor para mi clase en Android Retrofit library
  • Uso de Gson y Retrofit 2 para deserializar las complejas respuestas de la API
  • Retrofit, devolución de llamada para 204 No respuesta de contenido?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.