我正在考虑使用OAuth 2.0 服务帐户和域范围授权将我们的服务与Google Apps集成.一个特定的用例是:
当Google Apps客户注册我们的服务时,请使用客户现有的组织结构或资源(组织,组,设备,用户,文件夹,文件等)预先配置我们的服务.
当客户的Google Apps资源发生变化时,请将适用的更改与我们的服务同步.
我发现在使用服务帐户时,我需要为我要查询的域指定授权超级用户的电子邮件地址,如下所示:
var cred = new ServiceAccountCredential( new ServiceAccountCredential.Initializer( "{SERVICEACCOUNTEMAIL}" )
{
Scopes = new[]
{
DirectoryService.Scope.AdminDirectoryOrgunitReadonly
},
User = "{USERTOIMPERSONATE@customergadomain.com}"
}.FromCertificate( x509cert ) );
Run Code Online (Sandbox Code Playgroud)
如果我想要例如
理想情况下,我不希望将我们服务器上的自动后台流程与特定的Google Apps用户结合使用,以使资源与域管理员或用户可能在Google Apps端产生的更改保持同步.
我不想指定用户.所以我的主要问题是,我正在使用正确的授权模型来实现我的目标吗?
我的第二个问题不仅仅是一个问题.当委派已授予对域资源的访问权限时,要求模拟使用Admin API的目的是什么?与普通的OAuth 2.0授权工作流程相比,我不必代表用户进行授权,我只需要指定她的电子邮件地址即可.我是否错过了服务帐户/委托访问模型的意图?
我有一个应用程序,它将所有日志记录合并到一个单实例类中,以便于选择性调试打印等.该类已经存在了一年左右的工作顺利,但就在最近我碰巧将日志级别提升到它的最高设置(我很少这样做)和标准输出似乎最终会阻止.这会在下次代码的其他部分调用时println,或者当它尝试使用日志记录类(阻塞等待println返回)时导致破坏.
我的第一个想法是我的日志记录类遇到了某种并发问题,但是搜索堆栈跟踪会让我确信我的同步工作正常并且在任何给定时间只有一个线程试图写入控制台.以下是有问题的线程上的示例堆栈跟踪:
Thread [Thread-127] (Suspended)
FileOutputStream.writeBytes(byte[], int, int) line: not available [native method] [local variables unavailable]
FileOutputStream.write(byte[], int, int) line: 260
BufferedOutputStream.flushBuffer() line: 65
BufferedOutputStream.flush() line: 123
PrintStream.write(byte[], int, int) line: 432
StreamEncoder.writeBytes() line: 202
StreamEncoder.implFlushBuffer() line: 272
StreamEncoder.flushBuffer() line: 85
OutputStreamWriter.flushBuffer() line: 168
PrintStream.write(String) line: 477
PrintStream.print(String) line: 619
PrintStream.println(String) line: 756
Logger(Logger).LogMessage(String) line: 180
RemoteConsoleMonitor$1.run() line: 56
Thread.run() line: 662
Run Code Online (Sandbox Code Playgroud)
深入研究本机堆栈跟踪,我发现JVM进程在Windows本机ZwWriteFile调用上阻塞.我最好的猜测是JVM使用配置为同步读/写缓冲数据的命名管道,但读者已经以某种方式停止并让缓冲区填满.同时编写器被阻塞等待缓冲区空间可用,但这种情况从未发生过.这是同一线程的本机堆栈跟踪:
ntdll.dll!_ZwWriteFile@36() + 0x15 bytes
ntdll.dll!_ZwWriteFile@36() + 0x15 bytes
jvm.dll!InterfaceSupport::serialize_memory(JavaThread …Run Code Online (Sandbox Code Playgroud)