Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
powowstal
27 / 27 / 4
Регистрация: 21.03.2013
Сообщений: 293
#1

OAuth2 в google получить token через акаунт менеджер - Программирование Android

26.06.2015, 13:08. Просмотров 859. Ответов 9
Метки нет (Все метки)

Используя пример http://findevelop.blogspot.ru/2012/0...2-android.html получаю токен с менеджера акаунтов для работы с google spedseeps но выдает ошибку плохого токена
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
06-25 18:06:46.793: W/System.err(7729): com.google.gdata.util.AuthenticationException: Token invalid - AuthSub token has wrong scope
06-25 18:06:46.794: W/System.err(7729): <HTML>
06-25 18:06:46.794: W/System.err(7729): <HEAD>
06-25 18:06:46.794: W/System.err(7729): <TITLE>Token invalid - AuthSub token has wrong scope</TITLE>
06-25 18:06:46.794: W/System.err(7729): </HEAD>
06-25 18:06:46.794: W/System.err(7729): <BODY BGCOLOR="#FFFFFF" TEXT="#000000">
06-25 18:06:46.794: W/System.err(7729): <H1>Token invalid - AuthSub token has wrong scope</H1>
06-25 18:06:46.794: W/System.err(7729): <H2>Error 401</H2>
06-25 18:06:46.794: W/System.err(7729): </BODY>
06-25 18:06:46.794: W/System.err(7729): </HTML>
06-25 18:06:46.795: W/System.err(7729): at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:608)
06-25 18:06:46.795: W/System.err(7729): at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:564)
06-25 18:06:46.795: W/System.err(7729): at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:560)
06-25 18:06:46.795: W/System.err(7729): at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:538)
06-25 18:06:46.796: W/System.err(7729): at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:536)
06-25 18:06:46.796: W/System.err(7729): at com.google.gdata.client.Service.getFeed(Service.java:1135)
06-25 18:06:46.796: W/System.err(7729): at com.google.gdata.client.Service.getFeed(Service.java:1077)
06-25 18:06:46.796: W/System.err(7729): at com.google.gdata.client.GoogleService.getFeed(GoogleService.java:676)
06-25 18:06:46.796: W/System.err(7729): at com.google.gdata.client.Service.getFeed(Service.java:1034)
06-25 18:06:46.796: W/System.err(7729): at com.example.bill.VuborkaPoDateSGoogl.zaprosNaVuborku(VuborkaPoDateSGoogl.java:130)
06-25 18:06:46.796: W/System.err(7729): at com.example.bill.VuborkaPoDateSGoogl.run(VuborkaPoDateSGoogl.java:202)
06-25 18:06:46.796: W/System.err(7729): at java.lang.Thread.run(Thread.java:841)
Как получить нормальный токен и почему токен с акаунд менеджера не нормальный?

Буду благодарен за ответ или пример рабочего кода по получению токена, возможно другим способом.

Уже месяц пытаюсь настроить авторизацию выручайте )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2015, 13:08     OAuth2 в google получить token через акаунт менеджер
Посмотрите здесь:
Android Ошибка при переходе по ссылке из программы в Google Play (в акаунт разработчика)
Android Акаунт в приложение и авторизация через Facebok и ипользувания Parse?
Android Получить token от менеджера аккаунтов
Менеджер файлов (с управлением через PC по USB) Android
Как получить Google Advertising ID? Android
Android Получить рейтинг приложения из google play
Android Обновления через google play
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
26.06.2015, 17:38     OAuth2 в google получить token через акаунт менеджер #2
powowstal, товарищ, я так и не понял, зачем вам токен. У меня примеры работают без токенов, просто надо выбрать Google-аккаунт на устройстве, если их несколько. Я работал с Drive, там такая схема.
powowstal
27 / 27 / 4
Регистрация: 21.03.2013
Сообщений: 293
26.06.2015, 19:02  [ТС]     OAuth2 в google получить token через акаунт менеджер #3
CoolMind, указывать акк и пасс для авторизации можно было месяц назад, теперь только oauth2 можно авторизироватся. Мне нужна авторизация что бы рабтать с гуг документами
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
26.06.2015, 20:42     OAuth2 в google получить token через акаунт менеджер #4
powowstal, это я помню, вы писали об этом ранее. Я работал только с Google Drive по их инструкции. Там надо в консоли разработчика подключить API, сформировать debug.key и т.п. Вы это сделали?
powowstal
27 / 27 / 4
Регистрация: 21.03.2013
Сообщений: 293
26.06.2015, 21:10  [ТС]     OAuth2 в google получить token через акаунт менеджер #5
CoolMind, да. Эсли вы можете дайте код получения токена с гугл драйв (это мне и нужно, Гуго документы теперь и есть гугл драйв)
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
27.06.2015, 14:43     OAuth2 в google получить token через акаунт менеджер #6
powowstal, я никак не могу взять в толк, откуда его взять и куда вставить. Там не используются токены, на мой взгляд. Есть же примеры на сайте https://developers.google.com/drive/android/, точнее на github, ссылки на них есть там.
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
03.07.2015, 12:32     OAuth2 в google получить token через акаунт менеджер #7
powowstal, хотел у тебя спросить. А раньше как это выглядело вообще? Была какая-то форма с вводом логина и пароля? Это были данные от Google-аккаунта? И если правильно ввести, то давало доступ к документам?

Добавлено через 21 час 42 минуты
Вот ещё кое-что, может быть, пригодится: https://developers.google.com/android/guides/http-auth.
powowstal
27 / 27 / 4
Регистрация: 21.03.2013
Сообщений: 293
03.07.2015, 14:19  [ТС]     OAuth2 в google получить token через акаунт менеджер #8
CoolMind, раньше достаточно было в запросе указать, логин и пароль от гугл ака, без какой либо формы. Вот как раньше создавался запрос
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        SpreadsheetService service =
                new SpreadsheetService("bill");      
            // TODO: Authorize the service object for a specific user (see other sections) теперь тут нужно делать авторизацию oauth2, которую я раньше не делал
 
        try {
            service.setUserCredentials(USERNAME, PASSWORD);
        } catch (AuthenticationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            // Define the URL to request.  This should never change.
            URL spreadSheetFeedUrl = null;
            try {
                spreadSheetFeedUrl = new URL(
                    "https://spreadsheets.google.com/feeds/spreadsheets/private/full");
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
и дальше шли условия запроса

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  SpreadsheetQuery spreadsheetQuery = new SpreadsheetQuery(
                    spreadSheetFeedUrl);
                    spreadsheetQuery.setTitleQuery(tableName);
                    spreadsheetQuery.setTitleExact(true);
                    SpreadsheetFeed spreadsheet = null;
                    try {
                        spreadsheet = service.getFeed(spreadsheetQuery,
                                                               SpreadsheetFeed.class);
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (ServiceException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
03.07.2015, 15:51     OAuth2 в google получить token через акаунт менеджер #9
powowstal, понятно. Я ещё только подхожу к изучению Google Docs, немного умею работать с Drive.
Сегодня в очередной раз решил помучаться. Тот код, который вы указали выше, не применяется в Google Drive, ни разу такого не встречал.
Вот, например, какой примерно код нужно писать для работы с папками: https://developers.google.com/drive/android/folders. Это при условии, что пользователь авторизовался в приложении, т.е. нужно провести всю предварительную работу по добавлению приложения в консоли разработчика, авторизации пользователя.
Ориентировочно по последнему действию нужно смотреть код BaseDemoActivity, можете прямо его оттуда скопировать. Но в нём есть свои недостатки, о которых Google почему-то не упоминает (например, зацикливание вопроса выбора аккаунта).

Добавлено через 9 минут
Точнее, упоминает здесь: https://developers.google.com/androi...ndlingFailures, но даже там есть свои недочёты.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2015, 15:20     OAuth2 в google получить token через акаунт менеджер
Еще ссылки по теме:
Android Автообновление через Google Play
Реклама приложения через Google AdWords Android
Как получить приблизительное местоположение пользователя без использования сервисов Google? Android
База данных не устанавливается через Google play Android
Как сохранить данные своего приложения через аккаунт Google? Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
powowstal
27 / 27 / 4
Регистрация: 21.03.2013
Сообщений: 293
17.07.2015, 15:20  [ТС]     OAuth2 в google получить token через акаунт менеджер #10
Как я решил вопрос:
как "благородный" пират позаимствовав класс с 1й ссылки в теме
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class GAuthHelper {
 
     private AccountManager accountManager;
     private static final String ACC_TYPE = "com.google";
     private static final String SCOPE = "oauth2:[url]https://docs.google.com/feeds/[/url] [url]https://docs.googleusercontent.com/[/url] https://spreadsheets.google.com/feeds/";
     private Activity act;
     
     public GAuthHelper(Activity activity) {
      accountManager = AccountManager.get(activity);
      act = activity;
     }
     
     public Account[] getAccounts() {
      Account[] accounts = accountManager.getAccountsByType(ACC_TYPE);
      return accounts;
     }
     
     public String[] getAccNames() {
      Account[] accounts = getAccounts();
      String[] rez = new String[accounts.length];
      for (int i = 0; i < accounts.length; i++) {
       rez[i] = accounts[i].name;
      }
      return rez;
     }
     
     private Account getAccountByName(String name) {
      Account[] accounts = getAccounts();
      for (int i = 0; i < accounts.length; i++) {
       if (name.equals(accounts[i].name)) return accounts[i];
      }
      return null;
     }
     
     public void invalidateToken(String token) {
      accountManager.invalidateAuthToken(ACC_TYPE, token);
     }
     
     public void getAuthToken(String accname, OAuthCallbackListener authCallbackListener) {
      getAuthToken(getAccountByName(accname), authCallbackListener);
     }
     
     public void getAuthToken(Account account, final OAuthCallbackListener authCallbackListener) {
      accountManager.getAuthToken(account, SCOPE, null, act,
        new AccountManagerCallback<Bundle>() {
         public void run(AccountManagerFuture<Bundle> future) {
          try {
           String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
           authCallbackListener.callback(token);
          } catch (OperationCanceledException e) {
           authCallbackListener.callback(null);
          } catch (Exception e) {
           e.printStackTrace();
          }
         }
        }, null);
     
     }
     
     public static interface OAuthCallbackListener {
      public void callback(String authToken);
     }
    }
в своем активити получаю токен и пишу его в БД следующими методами
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    private GAuthHelper gah;
        public void oautorization (View v){
             gah = new GAuthHelper(this);         
              
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
                String authToken = prefs.getString(PREF_TOKEN, "");
                
            final String[] accn = gah.getAccNames();
             if (accn.length==0) {
                  Toast.makeText(this, "Google аккаунта не найдено", Toast.LENGTH_LONG).show();
                 } else {
             
         AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Выберете Google аккаунт");
    builder.setItems(accn, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, final int which) {
     saveToken(accn[which]);
     menu.findItem(1).setTitle("Вы зашли как: "+accn[which]);
    }
    }).create().show();
        }
             Toast toast = Toast.makeText(getApplicationContext(), 
                       "Выберите аккаунт", Toast.LENGTH_LONG); 
                    toast.show();
}
         private void saveToken(final String accname) {
              gah.getAuthToken(accname, new GAuthHelper.OAuthCallbackListener() {
               @Override
               public void callback(String authToken) {
                    
                if (authToken==null) {
                 Toast.makeText(MainActivity.this, "Operation cancelled", Toast.LENGTH_LONG).show();
                } else {
                 PreferenceManager.getDefaultSharedPreferences(MainActivity.this).edit().putString(PREF_TOKEN, authToken).commit();
               //  loadGDocs(authToken);
                 // Инициализируем наш класс-обёртку
                    BD sqh = new BD(getApplicationContext());
                    
                    // База нам нужна для записи и чтения
                    SQLiteDatabase sqdb = sqh.getWritableDatabase();
                    ContentValues cv = new ContentValues();
                    
                    //обнуляем таблицу перед записю
                    sqdb.delete(BD.TABLE_NAME_token, null, null);
                    
             
                    cv.put(BD.COLUMN_NAME[0], authToken);
                    cv.put(BD.COLUMN_NAME[1], accname);
 
                    sqdb.insert(BD.TABLE_NAME_token, null, cv);
                    sqh.close();
              
                }
               }
              });
             }
Важно знать: токе действует только пол часа, не забывайте обновлять его и не забудьте скачать и подключить нужные библиотеки.
Полученый токен можно отдавать так
Java
1
            service.setAuthSubToken(token);
На вопрос почему раньше не работал код и шла ошибка токена: я не правильно указал
Java
1
private static final String SCOPE = "oauth2:https://spreadsheets.google.com/feeds/";
строку в классе GAuthHelper
По логике вещей этой строкой мы говорим гуглу дать доступ к нужному ресурсу, узнать нужное разрешение можно тут https://developers.google.com/oauthplayground/




П.с. мой метод черновой, ежели господам не по нраву изложенный метод извольте съ предоставить лучший вариант кода или молчите в тряпку "трюмные крысы".
Yandex
Объявления
17.07.2015, 15:20     OAuth2 в google получить token через акаунт менеджер
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru