Зарегистрируйтесь, используя 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