C# OAuth2从后端服务访问和刷新令牌
我是Android应用程序的后端web服务开发人员。我们以订阅的形式向应用程序提供服务,并正在考虑使用Google Play进行订阅购买。我们有一个后端许可证服务器来跟踪应用程序中用户可用的服务 出于某些原因,我们希望从后端获取购买的订阅状态。但是我在从Google的OAuth2 web服务获取访问和刷新令牌时遇到了问题 我已按照以下页面的说明进行操作: 我没有直接访问用于设置客户端ID的Google帐户的权限,我让有权限的经理执行步骤来执行web调用以获取初始代码,该代码随后被提供给我。然后,我使用它调用带有HTTP POST的grant auth,但得到一个带有Json的HTTP 400,其中只包含一个“invalid_grant”错误。以下是邮政编码的示例:C# OAuth2从后端服务访问和刷新令牌,c#,google-api,google-play,C#,Google Api,Google Play,我是Android应用程序的后端web服务开发人员。我们以订阅的形式向应用程序提供服务,并正在考虑使用Google Play进行订阅购买。我们有一个后端许可证服务器来跟踪应用程序中用户可用的服务 出于某些原因,我们希望从后端获取购买的订阅状态。但是我在从Google的OAuth2 web服务获取访问和刷新令牌时遇到了问题 我已按照以下页面的说明进行操作: 我没有直接访问用于设置客户端ID的Google帐户的权限,我让有权限的经理执行步骤来执行web调用以获取初始代码,该代码随后被提供给我。然后,
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());
}
我担心的是,除了最初的code auth web browser调用之外,我无法从其他位置执行此操作,并且访问/刷新令牌无法从后端的web浏览器体验中执行 我写这篇文章是为了回答别人可能需要的问题。这是我得出的结论: 最初的“grant\u type=authorization\u code”调用似乎必须与OAuth代码请求在同一个会话中完成 我能够访问Google帐户凭据,并让重定向代码执行初始访问令牌请求,该请求还返回刷新令牌。它能够做到这一点。这似乎意味着初始访问和刷新令牌请求不能在后端进程中完成,而必须在会话环境(如web浏览器)中完成 然后我转过身,从C#发出一个标准post请求,用收到的刷新令牌刷新访问令牌,并能够获得一个新的访问令牌
编辑:作为一个提示。如果您已经为特定的客户端id和密码执行了初始授权代码调用。任何调用它的重试都不会在结果JSON中返回refresh_标记。仅当前访问令牌。所以一定要把它放在某个地方 你为什么不使用一个你可以访问的谷歌账户,来找出你的代码有什么问题。听起来你只需要进一步调试你的代码。我没有访问Google帐户的权限,它需要在特定的帐户下工作,这就是为什么我首先要问的。我在代码中没有看到任何关于的问题,所以我再次询问是否有人在这个过程中有任何经验,可以给出真正的建议。例如,为什么它不能像我们现在这样工作。