Google+ Moments.insert - 未经授权的错误
本文关键字:授权 错误 Moments insert Google+ | 更新日期: 2023-09-27 18:34:09
根据 Moments 的文档,使用 Google+ API 插入具有以下范围的自编是必需
的https://www.googleapis.com/auth/plus.login
我正在使用所有可能的 PlusService 范围进行身份验证,但仍然收到以下错误
Google.Apis.Requests.RequestError Unauthorized [401] errors [ 消息[未授权] 位置[ - ] 原因[未授权] 域[全球]
//Scopes for use with Google+ API
// activating Google+ API in console
// Documentation: https://developers.google.com/+/api/oauth
string[] scopes = new string[] {
PlusService.Scope.PlusLogin,
PlusService.Scope.UserinfoEmail,
PlusService.Scope.UserinfoProfile
};
string _client_id = "2046123799103-d0vpdthl4ms0soutcrpe036ckqn7rfpn.apps.googleusercontent.com";
string _client_secret = "NDmluNfTgUk6wgmy7cFo64RV";
PlusService service = null;
UserCredential credential = null;
try {
// here is where we Request the user to give us access, or use the Refresh Token that was previously stored in %AppData%
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets {
ClientId = _client_id, ClientSecret = _client_secret
},
scopes,
Environment.UserName,
CancellationToken.None,
new FileDataStore("Daimto.GooglePlus.Auth.Store")).Result;
} catch (Exception ex) {
//If the user hits cancel you wont get access.
if (ex.InnerException.Message.IndexOf("access_denied") != -1) {
Console.WriteLine("User declined access");
Console.ReadLine();
return;
} else {
Console.WriteLine("Unknown Authentication Error:" + ex.Message);
Console.ReadLine();
return;
}
}
// Now we create a Google service. All of our requests will be run though this.
service = new PlusService(new BaseClientService.Initializer() {
HttpClientInitializer = credential,
ApplicationName = "Google Plus Sample",
});
Moment body = new Moment();
body.Type = "http://schema.org/AddAction";
ItemScope itemScope = new ItemScope();
itemScope.Id = "target-id-1";
itemScope.Type = "http://schema.org/AddAction";
itemScope.Name = "The Google+ Platform";
itemScope.Description = "A page that describes just how awesome Google+ is!";
itemScope.Image = "https://developers.google.com/+/plugins/snippet/examples/thing.png";
body.Object = itemScope;
try {
var l = service.Moments.Insert(body, "me", MomentsResource.InsertRequest.CollectionEnum.Vault);
l.Execute();
} catch (Exception ex) {
int i = 1;
}
我已经测试了身份验证,它正在工作,我能够列出活动和其他内容。 它唯一的插入时刻给了我这个错误。 我也尝试在PHP中执行此操作,但遇到了相同的错误。 我错过了什么?
更新:我在文档中发现了一些东西。
对时刻进行验证时,必须包括 数据请求可见操作参数,用于指定应用的类型 应用程序将写入的活动。
我还没有弄清楚如何设置这个数据请求可见操作。
正如您所注意到的,您需要将request_visible_actions
参数添加到请求中。Google的大多数其他OAuth库都添加了执行此操作的快捷方式,但看起来.NET库没有。例如,PHP 库有 setRequestVisibleActions((。
在内部,方便的方法GoogleWebAuthorizationBroker.AuthorizeAsync()
调用AuthorizationCodeFlow.CreateAuthorizationCodeRequest()
生成调用中使用的 URL。您可以子类化AuthorizationCodeFlow
和AuthorizationCodeRequestUrl
(它返回(以添加有问题的参数,然后更直接地完成流程。
您可以在 https://github.com/gguuss/google-dotnet-demo/blob/master/AuthWithAppActivities/Program.cs
您还可以使用 Google+ 登录按钮执行初始身份验证流程,并将一次性代码传递给服务器,然后服务器可以继续将其转换为有效令牌。由于"登录"按钮具有 data-requestvisibleactions
属性,因此这将为您处理身份验证的该部分。