Ответ 1
Как получить токен доступа с помощью gmail api?
Ans: В соответствии с в следующем учебнике вы используете OAuth 2.0
. Таким образом, существует базовый шаблон для доступа к API Google с помощью OAuth 2.0
. Он следует за 4 этапами:
- Получите учетные данные OAuth 2.0 в консоли разработчика Google.
- Получить токен доступа с сервера авторизации Google.
- Отправлять токен доступа в API.
- При необходимости обновите токен доступа.
Подробнее см. в руководстве - Использование OAuth 2.0 для доступа к API Google
Вы должны посетить Google Developers Console, чтобы получить учетные данные OAuth 2.0, такие как client ID
и client secret
, которые известны как Google, так и ваше приложение
Анализ корневой причины:
Выпуск-1:
Изучив свой код, некоторые из них не найдены. Если ваш код работает гладко, тогда код всегда дает пустую строку. Поскольку ваш метод AccessToken()
всегда возвращает return "";
Выпуск-2:
catch (Exception e)
{
System.out.println("Error.");
}
Блок try catch будет блокировать исключения. Потому что, похоже, вы не правильно завершили свой код. Вы пропустили encoding
, а также использовали JSONObject
, который готовит токен доступа. Таким образом, он дает результат как
Ошибка.
Решение:
Я понял, что ваш код похож на этот учебник
Поскольку вашему решению требуется больше изменений для решения проблемы. Поэтому я предлагаю вам использовать LinkedHashMap или ArrayList. Это обеспечит более простой способ решения. Поэтому я даю вам 2 примера кода, чтобы сделать вашу жизнь проще. Вы можете выбрать любой из них. Вам нужно изменить refresh_token, client id, client secret and grant type
как ваш.
private String getAccessToken()
{
try
{
Map<String,Object> params = new LinkedHashMap<>();
params.put("grant_type","refresh_token");
params.put("client_id",[YOUR CLIENT ID]);
params.put("client_secret",[YOUR CLIENT SECRET]);
params.put("refresh_token",[YOUR REFRESH TOKEN]);
StringBuilder postData = new StringBuilder();
for(Map.Entry<String,Object> param : params.entrySet())
{
if(postData.length() != 0)
{
postData.append('&');
}
postData.append(URLEncoder.encode(param.getKey(),"UTF-8"));
postData.append('=');
postData.append(URLEncoder.encode(String.valueOf(param.getValue()),"UTF-8"));
}
byte[] postDataBytes = postData.toString().getBytes("UTF-8");
URL url = new URL("https://accounts.google.com/o/oauth2/token");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.getOutputStream().write(postDataBytes);
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
StringBuffer buffer = new StringBuffer();
for (String line = reader.readLine(); line != null; line = reader.readLine())
{
buffer.append(line);
}
JSONObject json = new JSONObject(buffer.toString());
String accessToken = json.getString("access_token");
return accessToken;
}
catch (Exception ex)
{
ex.printStackTrace();
}
return null;
}
Для доступа к разработчику google play android developer вам необходимо пройти предыдущий токен обновления, чтобы получить токен доступа
private String getAccessToken(String refreshToken){
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/token");
try
{
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("grant_type", "refresh_token"));
nameValuePairs.add(new BasicNameValuePair("client_id", GOOGLE_CLIENT_ID));
nameValuePairs.add(new BasicNameValuePair("client_secret", GOOGLE_CLIENT_SECRET));
nameValuePairs.add(new BasicNameValuePair("refresh_token", refreshToken));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
org.apache.http.HttpResponse response = client.execute(post);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer buffer = new StringBuffer();
for (String line = reader.readLine(); line != null; line = reader.readLine())
{
buffer.append(line);
}
JSONObject json = new JSONObject(buffer.toString());
String accessToken = json.getString("access_token");
return accessToken;
}
catch (IOException e) { e.printStackTrace(); }
return null;
}
Ссылка на ресурс:
-
Невозможно получить информацию о подписке из API разработчика Google Play Android
-
Использование java.net.URLConnection для запуска и обработки HTTP-запросов
Надеемся, что эти samples
и resource link
помогут вам решить вашу проблему и получить доступ к access token
.
Что такое 400 плохих запросов?
Ans: Указывает, что запрос был недопустимым. Отсутствует идентификатор родителя, или комбинация запрошенных размеров или показателей недействительна.
Рекомендуемое действие: Вам нужно внести изменения в запрос API, чтобы он работал.
Для
HTTP/1.1 400 Bad Request error
вы можете пройти через мой другой ответить. Это поможет вам понять смыслwhich host you need to use
и какие условия вам необходимо применить.
Почему токен истекает? Каков предел токена?
Токен может перестать работать по одной из следующих причин:
- Пользователь имеет
revoked
доступ. - Токен не использовался для
six months
. -
user changed passwords
и токен содержит Gmail, Календарь, Контакты или Hangouts. - У учетной записи пользователя есть
exceeded a certain number of token requests
.
Существует currently a limit of 25 refresh tokens per user account per client
. Если предел достигнут, создание нового токена автоматически аннулирует старейший токен без предупреждения. Это ограничение не распространяется на учетные записи служб.
Какие меры предосторожности следует соблюдать?
Меры предосторожности - 1:
Некоторые запросы требуют этапа аутентификации, на котором пользователь входит в систему с их учетной записью Google. После входа в систему пользователь спрашивает, они готовы предоставить разрешения, которые ваша заявка запрос. Этот процесс называется пользовательским соглашением.
Если пользователь предоставляет разрешение, Сервер авторизации Google отправляет вашему приложению токен доступа (или код авторизации, который ваше приложение может использовать для получения токена доступа). Если пользователь делает не предоставлять разрешение, сервер возвращает ошибку.
Меры предосторожности - 2:
Если для Google+ API выпущен токен доступа, он не предоставляет доступ к API контактов Google. Однако вы можете отправить этот доступ токен API Google+ несколько раз для аналогичных операций.
Меры предосторожности - 3:
Ток доступа обычно имеет срок годности 1 час, после который вы получите сообщение об ошибке, если попытаетесь его использовать. Google Credentialзаботится о том, чтобы автоматически "обновлять" токен, что просто означает получение нового токена доступа.
Сохранить токены обновления в безопасном долгосрочном хранилище и продолжать использовать до тех пор, пока они остаются в силе. Пределы применяются к числу обновлять токены, которые выдаются на комбинацию клиент-пользователь, и за пользователь на всех клиентах, и эти ограничения различны. Если ваш приложения требуют достаточно обновить токены, чтобы пройти один из ограничения, старые токены обновления перестают работать.