Проверка и использование Android auth_token на стороне сервера - PullRequest
3 голосов
/ 21 декабря 2011

Как я могу проверить auth_token, возвращенный из

token = bundle.getString(AccountManager.KEY_AUTHTOKEN);

?

После того, как я получу нового пользователя на Android, мне нужно вставить его в свою сторону сервера базы данных, но мне нужнопрежде чем я это сделаю, проверьте токен.

Я пытаюсь использовать токен следующим образом:

url = 'https://www.googleapis.com/oauth2/v1/userinfo?access_token=%s' % access_token

, но Google возвращает «Несанкционированный доступ».

Как можноЯ получаю доступ к

https://www.googleapis.com/oauth2/v1/userinfo

с помощью Android AccountManager, предоставленного auth_token?

Ответы [ 4 ]

6 голосов
/ 12 июня 2012

Возможно, вы просто пропускаете префикс oauth2: перед вашим authTokenType.

Этот код работает:

// Note the `oauth2:` prefix
private static final String AUTH_TOKEN_TYPE_USERINFO_PROFILE =
    "oauth2:https://www.googleapis.com/auth/userinfo.profile";

// TODO: allow the use to choose which account to use
Account acct = accountManager.getAccountsByType("com.google")[0];

accountManager.getAuthToken(acct, AUTH_TOKEN_TYPE_USERINFO_PROFILE,
    null, this, new AccountManagerCallback<Bundle>() {
      @Override
      public void run(AccountManagerFuture<Bundle> future) {
        try {
          String accessToken = future.getResult().getString(
              AccountManager.KEY_AUTHTOKEN);
          Log.i(TAG, "Got OAuth2 access token: " + accessToken);
          /*
             Your code here. Use one of two options. In each case replace ... with
             the above OAuth2 access token:

             1) GET https://www.googleapis.com/oauth2/v1/userinfo?access_token=...

             2) GET https://www.googleapis.com/oauth2/v1/userinfo with this header:
                Authorization: Bearer ...
          */
        } catch (OperationCanceledException e) {
          // TODO handle this case
          Log.w(TAG, "The user has did not allow access");
        } catch (Exception e) {
          // TODO handle this exception
          Log.w(TAG, "Unexpected exception", e);
        }
      }
    }, null);

}

1 голос
/ 07 января 2012

Токен, возвращаемый из AccountManager, является токеном ClientLogin, а не токеном OAuth. Поэтому вы не можете использовать API, связанный с OAuth. Но вы все равно можете получать данные календаря, контактные данные или другие данные, поддерживаемые ClientLogin.

Например, если вы получаете «cp» для контактов, на сервере вы можете использовать

curl -H 'Authorization: GoogleLogin auth="Your_ClientLogin_token"' https://www.google.com//m8/feeds/contacts/default/full

Используя Zend Gdata, вы можете сделать это по

$client = new Zend_Gdata_HttpClient;
$client->setClientLoginToken($token); // $token is your ClientLogin token
$gdata = new Zend_Gdata($client);

// perform query and get result feed
$query = new Zend_Gdata_Query('http://www.google.com/m8/feeds/contacts/default/full');
$feed = $gdata->getFeed($query);

Однако использование токена ClientLogin на стороне сервера не рекомендуется, как указано в http://code.google.com/apis/gdata/faq.html#which_auth_mech http://code.google.com/apis/gdata/faq.html#AuthClientLoginWebapps

0 голосов
/ 22 декабря 2011

Наконец-то все заработало, используя этот метод:

https://sites.google.com/site/oauthgoog/oauth-practices/mobile-apps-for-complex-login-systems/samplecode

0 голосов
/ 21 декабря 2011

Вы должны иметь возможность использовать его для получения информации о пользователе с помощью Google API. Обычно токен канала OAuth 2.0 вставляется в HTTP-заголовок авторизации при вызове RESTful API.

Смотрите образец, приведенный здесь: http://code.google.com/p/google-api-java-client/wiki/AndroidAccountManager

...