Я делаю приложение, которое должно позволить пользователю зарегистрироваться через свою учетную запись Google. Я хочу автоматически получать как можно больше информации о профиле. Я нашел этот очень интересный пример, который позволил бы мне получить много информации (см. шаг 4 это демо). Теперь, как я могу использовать его на Android? Я видел много примеров того, как получить токен аутентификации с помощью AccountManager с Oauth2 (пример), но я не знаю что делать оттуда, чтобы сделать эти звонки и получить эту информацию. Кроме того, в этом примере код написан на javascript, и я не знаю, как правильно перенести его на java...
Я уже выполнил регистрацию в консоли разработчика Google.
Являются ли Oauth2 и OpenID одним и тем же? Если нет, то должен ли я использовать один ИЛИ другой?
Android — Oauth2, AccountManager и Google: получение данных профиля
- Это официальный документ о начале работы с Tasks API. и OAuth 2.0 на Android 19.05.2014
- это разница OAuth2 и Open ID 19.05.2014
- Спасибо, эти ссылки были очень полезны. Теперь, поскольку пример, который я связал (первая ссылка), использует OpenID, мне нужно его использовать или я могу использовать Oauth2 Google? Могу ли я перейти к шагу 3 примера и использовать токен, полученный с помощью AccountManager Android? 19.05.2014
Ответы:
Готово. Как и ожидалось, я нашел всю информацию в документах и с помощью Oauth2 Playground Google помог понять, что нужно отправить на https://www.googleapis.com/oauth2/v1/userinfo
, чтобы получить данные профиля.
В итоге оказалось, что для этого нам не нужно создавать идентификатор клиента в консоли разработчика Google.
Теперь перейдем к коду. Активность:
public class MainActivity extends Activity {
public Activity mContext;
private AccountManager accountManager;
private final String SCOPES = "oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile";
private String authToken;
private GetProfileDataTask googleTask;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
mContext = this;
accountManager = AccountManager.get(mContext);
//other stuff here...
}
public void getProfileData() {
accountManager.getAuthTokenByFeatures(
"com.google",
SCOPES,
null, mContext, null, null,
new AccountManagerCallback<Bundle>() {
public void run(AccountManagerFuture<Bundle> future) {
try {
Bundle bundle = future.getResult();
//bundle.getString(AccountManager.KEY_ACCOUNT_NAME);
//bundle.getString(AccountManager.KEY_ACCOUNT_TYPE);
authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
} catch (Exception e) {
System.out.println("getAuthTokenByFeatures() cancelled or failed:");
e.printStackTrace();
authToken = "failure";
}
if(!authToken.equals("failure")) {
googleTask = new GetProfileDataTask();
googleTask.execute(authToken);
}
}
}, null);
}
}
AsyncTask, который получает данные:
public class GetProfileDataTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... tokens) {
RestTemplate restTemplate = new RestTemplate(false);
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
String json = null;
try {
//the response is of type "application/json"
json = restTemplate.getForObject(
"https://www.googleapis.com/oauth2/v1/userinfo" +
"?access_token={token}" +
"&access_token_type=bearer",
String.class,
tokens[0]); //this is the authToken from before, obv
} catch(RestClientException er) {
Log.e("GetProfileDataTask", er.toString(), er);
json = null;
}
return json;
}
@Override
protected void onPostExecute(String asyncResult) {
if(asyncResult != null)
//do something with your data, for example deserialize it
else
//do something else
}
}
Полученный json выглядит так:
{
"family_name": "Smith",
"name": "John Smith",
"picture": "https://lh3.googleusercontent.com/-randomlettersandnumbers/AAAAAAAAAAI/AAAAAAAAAAA/morerandomlettersandnumbers/photo.jpg",
"locale": "it",
"gender": "male",
"email": "[email protected]",
"link": "https://plus.google.com/133780085840848123456",
"given_name": "John",
"id": "133780085840848123456",
"verified_email": true
}
Поскольку вы хотите разрешить пользователям входить в ваше приложение через их учетные записи Google, вы можете использовать OpenID, и Google поддерживает это.
Примечание. Если вы предоставляете функцию входа с помощью Google, мы рекомендуем использовать вход через Google+.
Если вы просто хотите получить информацию о нас в Google от имени пользователей, вы можете просто использовать Oauth2. Обратитесь к официальным документам Google'а, я думаю, что они подробные, авторитетные и простые для понимания.
Как сказано в в этом документе:
5. Получите информацию о пользователе из токена ID
Идентификационный токен — это объект JSON с криптографической подписью, закодированный в базе 64. Обычно очень важно проверить идентификатор идентификатора перед его использованием, но, поскольку вы общаетесь напрямую с Google без посредников Канал HTTPS и используя свой секрет клиента для аутентификации в Google, вы можете быть уверены, что токен, который вы получаете, действительно исходит от Google и действителен.
Одним словом, внимательно прочитайте эти документы, и вы поймете, как реализовать свое приложение.