2015-07-28 2 views
5

Я пытаюсь реализовать Reddit oAuth2 (каждое приложение, использующее контент Reddit, должно иметь этот implemented) в Android-приложении «без пользователя», и я следую рекомендациям ,Reddit oAuth 2 для Android «беспроблемное» приложение с дооснащением

  1. I registered an app и получите client_id.
  2. Я следую за этим за API guidelines и this for Retrofit, чтобы правильно написать код Android.

Следовательно, я закодировал два подхода к проблеме, и кажется, что ни одна из них не работает. Вызов в соответствующем фрагменте одинакова для обоих вариантов, и он идет следующим образом:

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

ВАРИАНТ 1:

  • интерфейс дооснащения:

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

RetrofitError: 401 Unauthorized

ВАРИАНТ 2:

  • интерфейс дооснащения:

    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); 
    } 
    
  • результат:

кажется, что я получаю пустой ответ (я только получить «*» для области). Успешный ответ выглядит следующим образом:

enter image description here

и заголовок так:

enter image description here

У вас есть какие-либо идеи, что я делаю неправильно? Кто-нибудь это сделал?

The official Reddit github wiki не хватает примеров для Android (имеется практически на любом другом языке).

ответ

0

Я уже сталкивался с той же проблемой и делал это library, чтобы передать OAuth2 в Android. и библиотека является расширением для Retrofit, что упрощает процесс аутентификации с поставщиком OAuth 2.

+0

Вы использовали эту библиотеку для аутентификации пользователей reddit? Внедрение Reddit oauth немного необычно, поэтому я не уверен, поддерживает ли библиотека его. –

+0

На самом деле, я не использовал его на Reddit. Прочитайте ReadMe в Repo, если это не послужит вашей цели, скажите мне, или вы можете разветвить проект и что вам нужно – abozaid

0

Основываясь на вашем изображении с «пустым» ответом, показывая, что вы получили * назад в качестве области действия, я подозреваю, что ваше определение для ответа на токен доступа использует случай с верблюдом вместо случая змейки, поэтому JSON не получает правильно загружается в объект Java.

Смежные вопросы