首页 > 解决方案 > 调用 Google Directory API 修补用户密码时出现间歇性 412 错误

问题描述

我的应用程序的主要功能是使用 Google 的 Google.Apis.Admin.Directory.directory_v1 nuget 包更改 Google G-Suite 用户的密码。

API 调用在 95% 的时间都有效(并重置目标用户的密码),但间歇性地,API 调用会抛出带有消息文本的异常:

前提条件失败[412]错误[消息[前提条件失败]位置[If-Match - 标头]原因[conditionNotMet]域[全局]]

我做了很多研究,似乎有一个客户端指定的前提条件包含在一个(REST?)API 正在向 Google API 服务器发出的调用中,并且服务器正在确定该条件不是遇到(见 https://www.rfc-editor.org/rfc/rfc7232#section-4.2)或被更改对象的状态不好(https://developers.google.com/calendar/v3/errors)。奇怪的是,几乎所有时间都可以正常工作,但时不时会失败。看起来确实是某种基于资源的错误(最近提交的调用太多,域中许可的用户太多)或者可能是错误数据(密码错误或丢失,错误用户)甚至权限(用户在一个组中) /OU 无法管理)。但是错误消息没有给出任何继续,我主要排除了最明显的可能性。我用谷歌搜索了确切的消息,发现很多人都有类似的投诉,但没有记录在案的原因。

原始更正:我能够使用 Fiddler 捕获 REST 调用(配置了 https 捕获),但是在捕获时我无法重现原始错误,因此它没有多大帮助。

有关如何重现和/或解决问题的任何建议?

这是代码(请忽略任何明显的拼写错误——我不得不从几个来源中剪切/粘贴/合并来组装一个简单的小例子)——真正的代码几乎在所有时间都有效:

{
    userEmail = googleUser + "@" + domain; // e.g. BobSmith@myGoogleDomain.com
    
    // service is an instance of Google.Apis.Admin.Directory.directory_v1.DirectoryService
    var userget = service.Users.Get(userEmail); 
    User userob = userget.Execute();
    userob.ChangePasswordAtNextLogin = false;
    userob.Password = password;
    patchRequest=service.Users.Patch(userob, userEmail);
    patchRequest.Execute();
}
catch (Exception e)
{}

标签: c#restgoogle-admin-sdkgoogle-workspacegoogle-directory-api

解决方案


推荐阅读