我使用带有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();
有些事我已经加倍和三重检查:
- 您的服务器时钟与NTP不同步。
- 已超出刷新令牌限制。
醇>
服务器时钟同步。这发生在多台机器上。将调查是否/如何超出令牌限制。我的印象是API库会为我处理刷新。
我觉得我完全误解了某些事情(很可能)。我很感激有人指出我在这里遇到了什么问题。
答案 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。请务必提及您还要添加帐户,并为其提供应用程序的帐户类型。我记得在我能够添加帐户之前必须在我的应用程序上执行此操作。你会认为这会出现在他们的文档中,但我不相信。