【发布时间】:2013-07-25 12:37:09
【问题描述】:
我正在尝试使用 Google API .NET 客户端库从我的 ASP.NET Web 服务器访问 Purchase Status API,这是使用 Purchase API v1.1 的推荐方式。但是,此 API 的 Authorization page 建议将 Web 请求直接发送到 Google 的 OAuth2 页面,而不是使用相应的客户端库。
好的,我用我能想象到的所有变体尝试了这两种方法,它们都导致“远程服务器返回错误:(400) 错误请求。”。
现在我做了什么来表达我的观点。首先,我已经完成了授权页面的创建 API 控制台项目下的所有步骤 1-8。接下来,我按照那里的描述生成了一个刷新令牌。在刷新令牌生成期间,我选择了与发布我的 Android 应用程序(现在处于发布测试版状态)相同的 Google 帐户。
接下来我创建了一个控制台 C# 应用程序,用于在 Visual Studio 中进行测试(可能是控制台应用程序有问题?) 并尝试使用此代码(在一些 Google API 示例中找到)调用购买 API:
private static void Main(string[] args)
{
var provider =
new WebServerClient(GoogleAuthenticationServer.Description)
{
ClientIdentifier = "91....751.apps.googleusercontent.com",
ClientSecret = "wRT0Kf_b....ow"
};
var auth = new OAuth2Authenticator<WebServerClient>(
provider, GetAuthorization);
var service = new AndroidPublisherService(
new BaseClientService.Initializer()
{
Authenticator = auth,
ApplicationName = APP_NAME
});
var request = service.Inapppurchases.Get(
PACKAGE_NAME, PRODUCT_ID, PURCHASE_TOKEN);
var purchaseState = request.Execute();
Console.WriteLine(JsonConvert.SerializeObject(purchaseState));
}
private static IAuthorizationState GetAuthorization(WebServerClient client)
{
IAuthorizationState state =
new AuthorizationState(
new[] {"https://www.googleapis.com/auth/androidpublisher"})
{
RefreshToken = "4/lWX1B3nU0_Ya....gAI"
};
// below is my redirect URI which I used to get a refresh token
// I tried with and without this statement
state.Callback = new Uri("https://XXXXX.com/oauth2callback/");
client.RefreshToken(state); // <-- Here we have (400) Bad request
return state;
}
然后我尝试了这段代码来获取访问令牌(我在这里找到它:Google Calendar API - Bad Request (400) Trying To Swap Code For Access Token):
public static string GetAccessToken()
{
var request = WebRequest.Create(
"https://accounts.google.com/o/oauth2/token");
request.Method = "POST";
var postData =
string.Format(
@"code={0}&client_id={1}&client_secret={2}&redirect_uri={3}&grant_type=authorization_code",
// refresh token I got from browser
// also tried with Url encoded value
// 4%2FlWX1B3nU0_Yax....gAI
"4/lWX1B3nU0_Yax....gAI",
// ClientID from Google APIs Console
"919....1.apps.googleusercontent.com",
// Client secret from Google APIs Console
"wRT0Kf_bE....w",
// redirect URI from Google APIs Console
// also tried Url encoded value
// https%3A%2F%2FXXXXX.com%2Foauth2callback%2F
"https://XXXXX.com/oauth2callback/");
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
using (var dataStream = request.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
}
try
{
// request.GetResponse() --> (400) Bad request again!
using (var response = request.GetResponse())
{
using (var dataStream = response.GetResponseStream())
{
using (var reader = new StreamReader(dataStream))
{
var responseFromServer = reader.ReadToEnd();
var jsonResponse = JsonConvert.DeserializeObject<OAuth2Response>(responseFromServer);
return jsonResponse.access_token;
}
}
}
}
catch (Exception ex) { var x = ex; }
return null;
}
所以,总结我所有的长篇故事:
- 是否可以使用上述任一方法从 C# 控制台应用程序(无需用户交互)通过 OAuth2 授权?
- 我已经仔细检查了重定向 URI(因为我在 stackoverflow 上看到了很多关于它的讨论问题)和其他参数,如 ClientID 和 ClientSecret。我在上面的代码中还可以做错什么?
- 我是否需要在刷新令牌中对斜线进行 URL 编码(我看到使用客户端库的第一种方法可以做到)?
- 实现我的最终目标(从 ASP.NET Web 服务器购买 API 访问)的推荐方法是什么?
【问题讨论】:
-
你为什么要传递刷新令牌?我们所有的示例都使用常规的 OAuth2 流来获取访问令牌和刷新令牌。查看我们的示例存储库(您可以查看驱动示例 - code.google.com/p/google-api-dotnet-client/source/browse/…)。在这种情况下,.NET 客户端库将为您设置每个请求的授权标头(在库与访问令牌交换代码之后)。请尝试使用我们所有示例中提到的 OAuth2 库。
-
@peleyal 这些例子是我的出发点。但是,Google Drive 示例使用
AuthorizationMgr类,它在后台使用WindowTitleNativeAuthorizationFlow和LoopbackServerAuthorizationFlow类来执行 OAuth 任务。它们似乎都不适合服务,因为WindowTitleNativeAuthorizationFlow调用OAuth2AuthorizationDialog.ShowDialog(url)和LoopbackServerAuthorizationFlow调用Process.Start(authUrl.ToString())。我需要在 ASP.NET 进程的上下文中执行 OAuth 授权没有用户交互。
标签: android google-api oauth-2.0 in-app-purchase google-api-dotnet-client