私は Android アプリのバックエンド Web サービス開発者です。サブスクリプションとしてアプリにサービスを提供しており、サブスクリプションの購入に Google Play を使用することを検討しています。アプリでユーザーが利用できるサービスを追跡するバックエンド ライセンス サーバーがあります。
特定の理由により、バックエンドから購入のサブスクリプション ステータスを取得したいと考えています。しかし、Google の OAuth2 Web サービスからアクセス トークンとリフレッシュ トークンを取得する際に問題が発生しました。
次のページの指示に従いました: Google Play Android Developer API
クライアント ID のセットアップに使用される Google アカウントに直接アクセスすることはできません。また、最初のコードを取得するための Web 呼び出しを実行する手順を実行するためのアクセス権を持つマネージャーがいて、それが私に与えられました。次に、それを使用してHTTP POSTで許可認証を呼び出しますが、「invalid_grant」エラーのみを含むJsonでHTTP 400を取得します。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());
}
最初のコード認証 Web ブラウザー呼び出しとは別の場所から実行できないこと、および Web ブラウザー エクスペリエンスのバックエンドからアクセス/リフレッシュ トークンを実行できないことを懸念しています。