Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何保护被称为任务的Google云端点方法?_Android_Google App Engine_Oauth 2.0_Google Cloud Endpoints - Fatal编程技术网

Android 如何保护被称为任务的Google云端点方法?

Android 如何保护被称为任务的Google云端点方法?,android,google-app-engine,oauth-2.0,google-cloud-endpoints,Android,Google App Engine,Oauth 2.0,Google Cloud Endpoints,我有一个android应用程序与我的谷歌云端点后端对话 在其中一个端点方法中,我将一个“任务”推送到队列中 该任务由另一个端点方法处理,例如“/taskenpoint/doSomeWork” 我已通过将“/\u ah/spi/taskendpoint/*”的访问权限限制为“管理员用户”,从而保护了此端点方法(处理任务功能)— 我已经从浏览器中检查过了,一切正常,只允许管理员用户访问url 但是,现在的另一个问题是,相同的任务端点和方法在浏览器中的Google endpoint API explo

我有一个android应用程序与我的谷歌云端点后端对话

在其中一个端点方法中,我将一个“任务”推送到队列中

该任务由另一个端点方法处理,例如“/taskenpoint/doSomeWork”

我已通过将“/\u ah/spi/taskendpoint/*”的访问权限限制为“管理员用户”,从而保护了此端点方法(处理任务功能)—

我已经从浏览器中检查过了,一切正常,只允许管理员用户访问url

但是,现在的另一个问题是,相同的任务端点和方法在浏览器中的Google endpoint API explorer中可见,任何人都可以在此处输入值并使用任务方法。如何使此方法在API资源管理器中不可见,因为此方法仅为任务所需

另外,虽然我的应用程序使用OAuth身份验证,但它用于对android客户端进行身份验证,在本例中,它只是一个端点方法,通过任务调用另一个端点方法


我找不到很多关于这方面的文档,因此我非常感谢您的帮助

这就是我最终解决阻止任何外部请求访问我的任务url的总体问题的方法-

首先,使用(已在原始帖子中提到)阻止“\u ah/spi”对任务url的访问

其次,现在要阻止对通过api资源管理器传入的任务url的“\u ah/api”(这是主要问题)请求的访问,我所做的是-

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

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

因此,当您从API资源管理器调用该方法时,这些头为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 
    }

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) 生成令牌

3) 使用以前创建的令牌

GoogleCredential credential=新建GoogleCredential().setAccessToken(accessToken)


一种解决方法是,我可以知道API Explorer是否调用了endpoint方法,然后在代码中拒绝该请求。有没有办法知道API explorer是否调用了endpoint方法?是的,这就是解决方案。在endpoint类中,顶部的
@Api
部分应该有一行类似于
clientId={com.google.Api.server.spi.Constant.Api\u EXPLORER\u CLIENT\u ID,您的\u android\u CLIENT\u ID}
。删除api explorer项。这些字段不在任务的oauth结构中使用,因为对任务方法的调用是从app engine内部进行的,而不是从android客户端进行的,因此未使用auth。如果使用auth,则有必要对任务请求进行身份验证,没有干净的方法可以做到这一点。下面找到了一个更简单的方法来解决这个问题。。