我是Android应用的后端网络服务开发人员。我们正在为该应用提供订阅服务,并正在考虑使用Google Play进行订阅购买。我们有一个后端许可证服务器,用于跟踪应用程序中用户可用的服务。
出于某些原因,我们希望从后端获得购买的订阅状态。但是我遇到了从Google的OAuth2网络服务获取访问权限和刷新令牌的问题。
我已按照以下页面中的说明操作:Google Play Android Developer API
我无法直接访问用于设置客户端ID的Google帐户,并且我有权访问执行网络调用以获取初始代码的管理员,然后将其提供给我。然后,我使用它来通过HTTP POST调用授权auth,但是使用Json获取HTTP 400只包含“invalid_grant”错误。以下是POST代码的示例:
string postData = String.Format("code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type=authorization_code",
oauthCode,
clientId,
clientSecret,
redirectURL
);
byte[] data = Encoding.UTF8.GetBytes(postData);
try
{
HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/o/oauth2/token");
wreq.Method = "POST";
wreq.ContentType = "application/x-www-form-urlencoded";
wreq.ContentLength = data.Length;
wreq.Accept = "application/json";
using (Stream wstream = wreq.GetRequestStream())
{
wstream.Write(data, 0, data.Length);
}
HttpWebResponse wresp = (HttpWebResponse)wreq.GetResponse();
if (wresp.StatusCode == HttpStatusCode.OK)
{
using (Stream rstream = wresp.GetResponseStream())
{
StringBuilder jresp = new StringBuilder();
byte[] buffer = new byte[512];
int read = 0;
while ((read = rstream.Read(buffer, 0, buffer.Length)) > 0)
jresp.Append(Encoding.UTF8.GetString(buffer, 0, read));
Console.WriteLine(jresp.ToString());
}
}
else
Console.WriteLine("damn...");
}
catch (WebException wex)
{
Console.WriteLine(wex.ToString());
Console.WriteLine("================================");
if (wex.Response != null)
{
StringBuilder inner = new StringBuilder();
byte[] buffer = new byte[512];
int read = 0;
using (Stream xstream = wex.Response.GetResponseStream())
{
while ((read = xstream.Read(buffer, 0, buffer.Length)) > 0)
inner.Append(Encoding.UTF8.GetString(buffer, 0, read));
}
Console.WriteLine(inner.ToString());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
我担心我将无法从与初始代码auth Web浏览器调用不同的位置执行此操作,并且无法从Web浏览器体验的后端执行访问/刷新令牌。
答案 0 :(得分:0)
我写这个作为答案,以防其他人需要它。这是我得出的结论:
最初的“grant_type = authorization_code”调用似乎必须在与OAuth代码请求相同的会话中完成。
我能够访问Google帐户凭据并让重定向代码执行初始访问令牌请求,该请求也会返回刷新令牌。它能够这样做。这似乎意味着初始访问和刷新令牌请求无法在后端进程中完成,必须在会话环境(如Web浏览器)中完成。
然后我转过身来,从C#做了一个标准的发布请求,用接收到的刷新令牌刷新访问令牌,并且能够获得一个新的访问令牌。
编辑:作为一个抬头。如果您已针对特定客户端ID和密码执行了初始authorization_code调用。任何调用它的重试都不会返回结果JSON中的refresh_token。只有当前的access_token。所以一定要把它存放在某个地方!