首页 文章

如何保护被称为任务的Google Cloud endpoints 方法?

提问于
浏览
0

我有一个Android应用程序与我的Google Cloud 终端后端交谈 .

在其中一个 endpoints 方法中,我正在关闭推送到队列的“任务” .

该任务由另一个 endpoints 方法处理,例如“/ taskendpoint / doSomeWork”

我已经通过将对"/_ah/spi/taskendpoint/*"的访问权限限制为"admin users"来保护此 endpoints 方法(处理任务功能),如此处所建议的那样 - https://developers.google.com/appengine/docs/java/taskqueue/overview-push#Java_Securing_URLs_for_tasks

我已经从浏览器检查过,一切都按预期工作,只允许管理员用户访问网址 .

但是,现在的另一个问题是,在浏览器中的Google endpoints API资源管理器中可以看到相同的任务 endpoints 和方法,任何人都可以在此处输入值并使用任务方法 . 如何在API资源管理器中隐藏此方法,因为此方法仅由任务需要?

此外,虽然我的应用程序使用OAuth身份验证,但它用于验证Android客户端,在这种情况下,它只是一个 endpoints 方法通过任务调用另一个 endpoints 方法 .

我找不到很多关于此的文档,所以我很感激任何帮助

2 回答

  • 1

    1)将用户参数添加到auth的方法

    @ApiMethod(name = "test", path = "myApi/test",
              scopes = {Constants.EMAIL_SCOPE},
                clientIds = {Constants.WEB_CLIENT_ID, 
                         Constants.ANDROID_CLIENT_ID, 
                         com.google.api.server.spi.Constant.API_EXPLORER_CLIENT_ID},
                         audiences = {Constants.ANDROID_AUDIENCE})
      public User test(User user) throws UnauthorizedException    {
    
          if (user == null) throw new UnauthorizedException("User not valid!");   
    
          return user;
      }
    

    2)生成令牌

    https://developers.google.com/accounts/docs/OAuth2WebServer

    3)使用先前创建的令牌

    GoogleCredential凭证=新的GoogleCredential() . setAccessToken(accessToken);

    https://code.google.com/p/google-api-java-client/wiki/OAuth2

  • 0

    这就是我最终解决阻止访问我的任务网址到任何外部请求的整体问题 -

    首先,使用https://developers.google.com/appengine/docs/java/taskqueue/overview-push#Java_Securing_URLs_for_tasks阻止“ _ah/spi ”访问任务网址(已在原帖中提及)

    其次,现在阻止访问通过API资源管理器进入的任务URL的“ _ah/api ”(这是主要问题)请求,这就是我所做的 -

    将HttpServletRquest添加到 endpoints 方法并检查任何与任务相关的标头,例如“X-AppEngine上,QUEUENAME”

    根据文档,GAE确保只有来自任务的请求才包含这些标头,其他任何请求都不会包含这些标头 .

    因此, when you call the method from the API explorer, these headers are null 并且您可以为收到的此类请求抛出异常,这些请求不是来自任务 . 下面是一个简短的代码示例 -

    @ApiMethod(name = "sendMessage", httpMethod = HttpMethod.POST)
    public void sendMessage(HttpServletRequest req, @Named("messageText") String MessageText)
    {
        String str = req.getHeader("X-AppEngine-QueueName");
        if(str==null)
        {
            // throw invalid request exception here 
        }
    

    ...

相关问题