如何使用gmail api获取访问令牌?
答:根据以下教程,您正在使用 .因此,有一个使用 访问 Google API 的基本模式。它遵循4个步骤:OAuth 2.0
OAuth 2.0
- 从 Google Developers Console 获取 OAuth 2.0 凭据。
- 从 Google 授权服务器获取访问令牌。
- 将访问令牌发送到 API。
- 如有必要,请刷新访问令牌。
有关详细信息,您可以按照教程 - 使用 OAuth 2.0 访问 Google API
您必须访问 Google 开发人员控制台才能获取 OAuth 2.0 凭据,例如 Google 和您的应用程序都知道的和client ID
client secret
根本原因分析:
问题 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;
}
要访问谷歌播放Android开发人员API,您需要传递以前的刷新令牌以获取访问令牌
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;
}
资源链接:
希望,这将帮助您解决问题并访问.samples
resource link
access token
答:它指示查询无效。缺少父 ID,或者请求的维度或指标组合无效。
建议的操作:您需要对 API 查询进行更改才能使其正常工作。
对于 ,你可以通过我的另一个答案。它将帮助您了解需要使用哪个主机
以及需要应用哪些条件。HTTP/1.1 400 Bad Request error
令牌可能由于以下原因之一而停止工作:
- 用户具有访问权限。
revoked
- 令牌未用于 。
six months
- 和令牌包含 Gmail、日历、联系人或环聊范围。
user changed passwords
- 用户帐户具有 。
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 颁发了访问令牌,则不会授予对 Google 通讯录 API 的访问权限。但是,您可以多次将该访问令牌发送到 Google+ API 以进行类似操作。
注意事项 - 3:
访问令牌的到期日期通常为 1 小时,在此日期之后,如果尝试使用它,则会收到错误。Google凭据负责自动“刷新”令牌,这仅意味着获取新的访问令牌。
将刷新令牌保存在安全的长期存储中,只要它们保持有效,就可以继续使用它们。限制适用于每个客户端-用户组合以及跨所有客户端的每个用户颁发的刷新令牌数,并且这些限制是不同的。如果应用程序请求足够的刷新令牌来超过其中一个限制,则较旧的刷新令牌将停止工作。