如何为Enrollment Token生成正确的Protobuf Duration?
解决Enrollment Token自定义过期时间的BadRequest问题
问题描述
尝试创建当天过期的Enrollment Token时,调用Create接口返回BadRequest错误,提示enrollment_token.duration下的Seconds和Nanos字段不存在。调试发现返回的token中Duration字段为null,仅默认生成创建后1小时过期的ExpirationTimestamp。官方指南提及可自定义时长,但当前Enrollment Token创建接口文档中无Duration字段,怀疑该功能已废弃。
原代码:
// Calculate Duration Timestamp now = Timestamp.FromDateTime(DateTime.UtcNow); Timestamp tomorrow = Timestamp.FromDateTime(DateTime.Today.AddDays(1).ToUniversalTime()); // Create a token with a policy name. Whatever device provisioned with this token will use this policy EnrollmentToken token = new EnrollmentToken(); token.PolicyName = policyID; token.Duration = tomorrow - now; // Build and execute a request to tie the token to our enterprise EnterprisesResource.EnrollmentTokensResource.CreateRequest request = androidManagementService.Enterprises.EnrollmentTokens.Create(token, enterprise.Name); var result = request.Execute();
原因分析
Android Management API已废弃Duration字段,当前创建Enrollment Token时需直接设置ExpirationTimestamp来指定过期时间,而非通过计算Duration的方式。官方指南可能未及时同步接口变更,导致出现文档与实际接口不一致的情况。
解决方案
直接给Enrollment Token的ExpirationTimestamp字段赋值为目标过期时间(当天结束的UTC时间),替换原有的Duration设置逻辑:
// 设置当天结束的UTC时间作为过期时间 Timestamp expirationTime = Timestamp.FromDateTime(DateTime.Today.AddDays(1).ToUniversalTime()); // 创建token并指定策略和过期时间 EnrollmentToken token = new EnrollmentToken(); token.PolicyName = policyID; token.ExpirationTimestamp = expirationTime; // 执行创建请求 EnterprisesResource.EnrollmentTokensResource.CreateRequest request = androidManagementService.Enterprises.EnrollmentTokens.Create(token, enterprise.Name); var result = request.Execute();
这样设置后,生成的Enrollment Token会在当天结束时过期,同时避免了因使用废弃字段导致的BadRequest错误。
内容的提问来源于stack exchange,提问作者Maximilian Hung
相关产品推荐
相关产品推荐

