Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.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上运行应用程序脚本?_Android_Google Apps Script_Oauth 2.0_Firebase Authentication_Google Apps Script Api - Fatal编程技术网

在Android上运行应用程序脚本?

在Android上运行应用程序脚本?,android,google-apps-script,oauth-2.0,firebase-authentication,google-apps-script-api,Android,Google Apps Script,Oauth 2.0,Firebase Authentication,Google Apps Script Api,我目前正在开发一款Android应用程序,它要求用户登录谷歌,然后通过运行应用程序脚本来验证用户是否属于谷歌集团(除了使用应用程序脚本,我还不知道如何做到这一点)。我可以使用Firebase身份验证让用户登录,但无论我尝试什么,我都无法运行应用程序脚本(脚本本身工作,因为它可以从浏览器运行),因为我似乎无法获得正确的授权(我收到401和403错误) 以下是我尝试过的一些事情: 使用谷歌应用程序脚本API Script service = new Script.Builder(new NetHtt

我目前正在开发一款Android应用程序,它要求用户登录谷歌,然后通过运行应用程序脚本来验证用户是否属于谷歌集团(除了使用应用程序脚本,我还不知道如何做到这一点)。我可以使用Firebase身份验证让用户登录,但无论我尝试什么,我都无法运行应用程序脚本(脚本本身工作,因为它可以从浏览器运行),因为我似乎无法获得正确的授权(我收到401和403错误)

以下是我尝试过的一些事情:

  • 使用谷歌应用程序脚本API

    Script service = new Script.Builder(new NetHttpTransport(), 
    JacksonFactory.getDefaultInstance(), credentials).setApplicationName(APPLICATION_NAME)
            .build();
    
    ExecutionRequest request = new ExecutionRequest()
            .setFunction("functionName");
    
    Operation op = service.scripts().run(MY_SCRIPT_ID, request).execute();
    
    if (op.getResponse() != null && op.getResponse().get("result") != null) {
         return op.getResponse().get("result");
    }
    
  • ()

  • 使用POST请求

    URL url = new URL("MY_SCRIPT_URL" + "?access_token=" + ACCESS_TOKEN);
    URLConnection conn = url.openConnection();
    conn.setDoOutput(true);
    
    HttpURLConnection urlConn = (HttpURLConnection) conn;
    urlConn.setRequestProperty("Authorization", "Bearer " + ACCESS_TOKEN);
    
    OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
    wr.write("");
    wr.flush();
    wr.close();
    
    if(urlConn.getResponseCode() == 200){
        BufferedReader reader = new BufferedReader(urlConn.getOutputStream());
        //....AND HERE I READ FROM THE OUTPUT STREAM
    }
    
  • (,)

    我曾尝试通过以下方式制作
    凭证

  • 使用Firebase身份验证访问令牌

    GoogleCredential credentials = new GoogleCredential()
        .createScoped(Arrays.asList(ScriptScopes.GROUPS))
        .setAccessToken(FIREBASE_ACCESS_TOKEN);
    
  • 使用服务帐户

    InputStream in = activity.getAssets().open("SERVICE_INFO_FILE");
    
    GoogleCredential credentials = GoogleCredential.fromStream(new FileInputStream(in))
        .createScoped(Arrays.asList(ScriptScopes.GROUPS));
    
    credentials.refreshToken();
    
  • 使用客户端密码

    GoogleCredential credentials = new GoogleCredential.Builder()
        .setClientSecrets("CLIENT_ID", "CLIENT_SECRET").build()
        .createScoped(Arrays.asList(ScriptScopes.GROUPS));
    
  • 还有一些需要注意的事项:

    • 应用程序脚本链接到与服务帐户和Firebase项目相同的Google云项目
    • 已为应用程序脚本API生成客户端机密
    那么,如何正确验证以用户身份访问应用程序脚本?还有没有其他方法可以访问用户所属的谷歌群组

    提前谢谢

    编辑

    在使用下面的代码时,我似乎已经让它正确地进行了身份验证

    GoogleAccountCredential credentials = GoogleAccountCredential.usingOAuth2(activity, Arrays.asList(ScriptScopes.GROUPS));
    
    credentials.getSelectedAccountName(FirebaseAuth.getInstance().getCurrentUser().getEmail());
    
    Script service = new Script.Builder(new NetHttpTransport(), 
        JacksonFactory.getDefaultInstance(), credentials).setApplicationName(APPLICATION_NAME)
                .build();
    
    ExecutionRequest request = new ExecutionRequest()
                .setFunction("testGroup");
    
    Operation op = service.scripts().run(MY_SCRIPT_ID, request).execute();
    
    但当它到达最后一行时,整个应用程序冻结,最终停止工作。我想这是因为应用程序正在等待应用程序脚本返回某些内容?有没有办法解决这个问题

    以下是应用程序脚本代码,顺便说一句:

    function testGroup() {
      //return 0;
      var groups = GroupsApp.getGroups();
      for(var i = 0; i < groups.length; i++){
        //Logger.log(groups[i].getEmail());
        if(groups[i].getEmail().equals('group1')){
          return 0;
        }else if(groups[i].getEmail().equals('group2')){
          return 1;
        }
      }
      return -1;
    }
    
    函数测试组(){
    //返回0;
    var groups=GroupsApp.getGroups();
    对于(变量i=0;i
    (即使我刚刚返回0,它仍然不起作用)。

    将与以下内容一起使用:


    你没有。。。在哪里?我试过的第一件事。但我现在要尝试使用GoogleAccountCredential而不是GoogleCredential!您可能还没有部署脚本。。。这是通过API运行它的先决条件。1.引用每个实例的错误2.发布应用程序脚本代码?第一个方法(
    1
    ):1.确切的错误是什么?2.您是否已将脚本部署为API可执行文件?第一个方法出现401错误,是的,我已将其部署为API可执行文件。
    我假设这是因为应用程序正在等待应用程序脚本返回某些内容?
    如果您的代码成功启动了应用程序脚本代码,则会记录在脚本编辑器>视图>执行中(包括它是一个api调用)-如果它在那里失败,那里将有错误日志。
    implementation "com.google.apis:google-api-services-script:v1-rev271-1.25.0"