Cha*_*pps 7 java google-app-engine service-accounts
我们在面向微服务的架构中广泛使用Google Cloud Endpoints(GCE).所有服务均为Google App Engine.对于面向公众的GAE服务,我们将使用标准的Android OAuth对真实用户进行身份验证.但是,对于非面向用户的服务,我们希望我们的Cloud Endpoints受到保护(不公开),但可以通过默认的GAE服务帐户访问.
例如,内部支付服务可能希望联系内部用户服务以获取用户的配置文件,使用默认的GAE服务帐户进行身份验证,这样我们就不需要在代码中嵌入任何凭据.我们正在使用生成的Java库.
我正在使用这样的代码用生成的libs初始化服务:
public User createUserService() {
AppIdentityCredential credential = new AppIdentityCredential(Lists.newArrayList(OAUTH_EMAIL_SCOPE))
return new User.Builder(new UrlFetchTransport(), new JacksonFactory, credential)
.setRootUrl(userServiceRootUrl)
.build()
}
Run Code Online (Sandbox Code Playgroud)
我们还尝试使用GoogleCredential.getApplicationDefault()并在该凭据对象上设置范围.
从第一个GAE服务调用的目标端点具有如下代码:
@Api(
name = "user",
version = "v1",
clientIds = Array(Constants.APP_ENGINE_SERVICE_ACCOUNT_CLIENT_ID)
)
class UserEndpoints {
/**
* GET /user/:id
*
* Get a single user by id
*/
@ApiMethod(
httpMethod = HttpMethod.GET,
path = "user/{id}"
)
def find(
@Named("id") id: Long,
authUser: GoogleUser
): User = {
if (authUser == null) {
throw new OAuthRequestException("Must be authenticated to use this endpoint!")
}
UserDAO.find(id) getOrElse {
throw new NotFoundException("User not found")
}
}
Run Code Online (Sandbox Code Playgroud)
上面使用的客户端ID是您可以在GAE服务帐户的JSON密钥文件中找到的客户端ID,如果您已将域范围委派添加到服务帐户,则会在API凭据控制台中显示该客户端ID.
我们还尝试了相应的变体,比如删除User参数,而是在@Api注释上设置authLevel = AuthLevel.REQUIRED.
没有骰子,我们总是得到这样的错误:
Request URL: https://user-service-dot-foo-dev.appspot.com/_ah/api/user/v1/user/1
Method: user.userEndpoints.find
Error Code: 403
Reason: insufficientAuthorizedParty
Message: Client_id is not allowed
Run Code Online (Sandbox Code Playgroud)
有谁知道 - 我们做错了什么?为什么使用服务帐户保护流量如此困难?
我们希望避免在我们的代码上嵌入凭据,因此请不要回答说我们需要创建一个手动服务帐户.
谢谢你提出任何好的建议!我们真的很惊讶与云端点进行服务器到服务器通信有多么困难!
| 归档时间: |
|
| 查看次数: |
277 次 |
| 最近记录: |