使用服务帐户返回将帐户插入Mirror API" invalid_grant"错误

时间:2014-08-19 14:12:20

标签: .net authentication google-glass google-gdk google-mirror-api

我使用带有Google服务帐户的Mirror API .NET Library通过MyGlass应用程序进行第三方身份验证。我按照Authentication for GDK Glassware文档对服务器端的用户进行身份验证,然后插入帐户。

当我尝试使用Mirror API插入新帐户时,我收到OAuth错误:" invalid_grant":

堆栈追踪:

  

Google.Apis.Auth.OAuth2.Responses.TokenResponseException未处理   按用户代码HResult = -2146233088消息=错误:" invalid_grant",   描述:"",Uri:""源= Google.Apis

     

在Google.Apis.Requests.ClientServiceRequest`1.Execute()中   C:\代码\ google.com \ Google处理API-DOTNET客户端\ default_182 \工具\ Google.Apis.Release \ BIN \调试\输出\默认\ SRC \ GoogleApis \蜜蜂\请求\ ClientServiceRequest.cs:线   96 \ r \ n

它被ClientServiceRequest.cs中的Execute()函数解包并抛出。第96行。

源代码:

const string password = "notasecret";
X509Certificate2 certificateToExport = new X509Certificate2(HostingEnvironment.MapPath("/Path/To/Certificate.p12"), password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
var rsa = (RSACryptoServiceProvider)certificateToExport.PrivateKey;

// Have to export the provider or you get an "Invalid Algorithm" error when 
// trying to sign the request.
RSACryptoServiceProvider cryptoProvider = new RSACryptoServiceProvider();
cryptoProvider.ImportParameters(rsa.ExportParameters(true));

var serviceAccountCredential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(id: "MYCLIENTID.apps.googleusercontent.com")
{
Key = cryptoProvider,
Scopes = new List<string>() { "https://www.googleapis.com/auth/glass.thirdpartyauth" },
User = "MYCLIENTID@developer.gserviceaccount.com"
});

var mirrorService = new MirrorService(new BaseClientService.Initializer() { HttpClientInitializer = serviceAccountCredential });
Account account = new Account() { AuthTokens = new AuthToken[] { new AuthToken() { AuthTokenValue = sessionKey, Type = "sessionKey" } } };

// Exception thrown here
Account insertedAccount = mirrorService.Accounts.Insert(account, userToken: userToken, accountType: "example.com", accountName: accountName).Execute();

有些事我已经加倍和三重检查:

  • 我有正确的客户ID和电子邮件地址。
  • 我提供了范围:https://www.googleapis.com/auth/glass.thirdpartyauth
  • MyGlass app webview作为查询参数传递给我的userToken被返回提供给MirrorAPI。
  • 我使用Google提供给我的证书签署了该请求。
  • MyGlass正在使用正确的身份验证重定向网址
  • Google Analytics documentation说的是&#34; invalid_grant&#34;错误:
  
      
  1. 您的服务器时钟与NTP不同步。
  2.   
  3. 已超出刷新令牌限制。
  4.   

服务器时钟同步。这发生在多台机器上。将调查是否/如何超出令牌限制。我的印象是API库会为我处理刷新。

我觉得我完全误解了某些事情(很可能)。我很感激有人指出我在这里遇到了什么问题。

2 个答案:

答案 0 :(得分:1)

chat thread开始,问题是由于在ServiceAccountCredential类中传递了错误的数据导致服务帐户身份验证失败。

原始问题中使用的代码段应修正为:

var serviceAccountCredential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(id: "MYCLIENTID@developer.gserviceaccount.com")
{
    Key = cryptoProvider,
    Scopes = new List<string>() { "https://www.googleapis.com/auth/glass.thirdpartyauth" }
});

答案 1 :(得分:0)

确保您已在https://developers.google.com/glass/distribute/form处提交了您的Glassware。请务必提及您还要添加帐户,并为其提供应用程序的帐户类型。我记得在我能够添加帐户之前必须在我的应用程序上执行此操作。你会认为这会出现在他们的文档中,但我不相信。