Я пытаюсь реализовать Reddit oAuth2 (каждое приложение, использующее контент Reddit, должно иметь этот implemented) в Android-приложении «без пользователя», и я следую рекомендациям ,Reddit oAuth 2 для Android «беспроблемное» приложение с дооснащением
- I registered an app и получите
client_id
. - Я следую за этим за 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); }
результат:
кажется, что я получаю пустой ответ (я только получить «*» для области). Успешный ответ выглядит следующим образом:
и заголовок так:
У вас есть какие-либо идеи, что я делаю неправильно? Кто-нибудь это сделал?
The official Reddit github wiki не хватает примеров для Android (имеется практически на любом другом языке).
Вы использовали эту библиотеку для аутентификации пользователей reddit? Внедрение Reddit oauth немного необычно, поэтому я не уверен, поддерживает ли библиотека его. –
На самом деле, я не использовал его на Reddit. Прочитайте ReadMe в Repo, если это не послужит вашей цели, скажите мне, или вы можете разветвить проект и что вам нужно – abozaid