Зарегистрируйтесь, используя Google Android Auth 2.0 HTTP-запрос после получения кода авторизации

https://developers.google.com/accounts/docs/OAuth2InstalledApp

Я даю пользователю возможность зарегистрироваться с помощью учетной записи Google в веб-представлении по следующей ссылке

webview.loadUrl("https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile&state=%2F&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&client_id=706645665586.apps.googleusercontent.com");

которые содержат мой идентификатор клиента и URI перенаправления в соответствии с данными консоли API Google, т. е. выбор URI перенаправления https://developers.google.com/accounts/docs/OAuth2InstalledApp

и, наконец, получить код авторизации, который возвращается в строке заголовка браузера с помощью view.getTitle()

После этого требуется еще один запрос. Фактический запрос может выглядеть следующим образом:

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-Type: application/x-www-form-urlencoded
code=4/y_jtre05wvb6QSPo0Tkx5AbLfWB
client_id=706645665586.apps.googleusercontent.com
client_secret={client_secret}&
redirect_uri=urn:ietf:wg:oauth:2.0:oob
grant_type=authorization_code

Так что теперь при выполнении HTTP POST-запроса..

    DefaultHttpClient httpcl = new DefaultHttpClient();
    HttpPost httpp = new HttpPost("https://accounts.google.com/o/oauth2/auth");
    List<NameValuePair> a = new ArrayList<NameValuePair>();
    a.add(new BasicNameValuePair("code", "4/y_jtre05wvb6QSPo0Tkx5AbLfWB"));
    a.add(new BasicNameValuePair("client_id", "706645665586.apps.googleusercontent.com"));
    try {
        StringEntity mEntity = new StringEntity("");
        mEntity.setContentType(" application/x-www-form-urlencoded");
        httpp.setEntity(mEntity);
        httpp.setEntity(new UrlEncodedFormEntity(a));
        HttpResponse response1 = httpcl.execute(httpp);

        String response = EntityUtils.toString(response1.getEntity());
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Итак, я получаю ответ Bad Token... Я пробую это со вчерашнего дня и буду благодарна за предложения и помощь. Моя главная цель - получить информацию о пользователе, используя учетную запись gmail в Android

2 ответа

Я думаю, что вы немного смешиваете различные потоки:

  • Поток на стороне клиента не требует секрета клиента, но в первую очередь предназначен для приложений Javascript.
  • Поток установленных приложений требует секрета клиента, хотя:

    Client_id и client_secret, полученные при регистрации, встроены в исходный код вашего приложения. В этом контексте client_secret, очевидно, не рассматривается как секрет.

    Вы, вероятно, сгенерировали идентификатор клиента в консоли API для Установленного приложения -> Android, поэтому вы получили только идентификатор клиента и должны были указать отпечаток сертификата вашего приложения. Этот тип идентификатора клиента предназначен для использования с недавно выпущенными и рекомендованными (потому что это более безопасными) сервисами Google Play.

    Если вы хотите использовать поток Установленных приложений вручную, вам нужно сгенерировать идентификатор клиента для Установленного приложения -> Другое, где вы также получите секрет клиента. При обмене кода авторизации на токен доступа вам необходимо указать все пять параметров:

    code            The authorization code returned from the initial request
    client_id       The client_id obtained during application registration
    client_secret   The client secret obtained during application registration
    redirect_uri    The URI registered with the application
    grant_type      As defined in the OAuth 2.0 specification, this field must contain a value of authorization_code
    

Я наконец нашел рабочий образец. Вы можете использовать API разработчиков Google+. Посмотрите этот проект на github и эту статью. Вот

Другие вопросы по тегам