Reddit oAuth 2 for Android a "win-win" application with retrofit

I am trying to implement Reddit oAuth2 (every application that uses Reddit content should have this one ) in "no user" Android browsers, and I follow the recommendations.

Therefore, I have encoded two approaches to the problem, and it seems that none of them work. The call in the corresponding fragment is the same for two parameters, and it looks like this:

  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.... :("); } }); } 

OPTION 1:

  • Retrofit Interface:

      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; } }; 
  • Result:

RetrofitError: 401 Unauthorized

OPTION 2:

  • Retrofit Interface:

      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); } 
  • result:

It seems that I am getting an empty answer (I only get "*" for the area). A successful answer is as follows:

enter image description here

and the title like this:

enter image description here

Do you have any idea what I'm doing wrong? Has anyone done this?

The official version of the Reddit github wiki contains no examples for Android (albeit in any other language).

+5
source share
2 answers

I have already encountered the same problem and am doing this library to pass OAuth2 to Android. and the library is an extension to Retrofit, which simplifies the authentication process with the OAuth 2 provider.

0
source

Based on your image with a "blank" response indicating that you received * back as a scope, I suspect that your definition uses a camel case instead of a snake case to respond to an access token, so JSON does not load correctly in a Java object.

0
source

All Articles