在安卓设备上运行 Apps Script?

4
我目前正在开发一款需要用户登录Google的Android应用程序,并通过运行Apps脚本来验证用户是否属于Google组(我无法找到除使用Apps脚本之外的其他方法)。我可以使用Firebase身份验证让用户登录,但无论我尝试什么,都无法运行Apps脚本(脚本本身能够在浏览器中运行),因为我似乎无法正确获取授权(我得到401和403错误)。
以下是我尝试过的一些方法:
  1. Using the Google Apps Script 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");
    }
    

(https://developers.google.com/apps-script/api/how-tos/execute)

  1. Using a POST Request

    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
    }
    

(在Android中运行Google应用脚本, 如何在OAuth 2.0中使用Google API传递“Authorization”标头值, 在字符串中添加POST请求头部, https://developers.google.com/identity/protocols/OAuth2InstalledApp)

我已尝试以下方式创建credentials

  1. Using a Firebase Authentication Access Token

    GoogleCredential credentials = new GoogleCredential()
        .createScoped(Arrays.asList(ScriptScopes.GROUPS))
        .setAccessToken(FIREBASE_ACCESS_TOKEN);
    
  2. Using a Service Account

    InputStream in = activity.getAssets().open("SERVICE_INFO_FILE");
    
    GoogleCredential credentials = GoogleCredential.fromStream(new FileInputStream(in))
        .createScoped(Arrays.asList(ScriptScopes.GROUPS));
    
    credentials.refreshToken();
    
  3. Using a Client Secret

    GoogleCredential credentials = new GoogleCredential.Builder()
        .setClientSecrets("CLIENT_ID", "CLIENT_SECRET").build()
        .createScoped(Arrays.asList(ScriptScopes.GROUPS));
    

需要注意的其他事项:

  • Apps Script与服务帐户和Firebase项目链接到同一个Google Cloud项目。
  • 客户端密钥是为Apps Scripts API生成的。

那么,我如何正确进行身份验证以作为用户访问Apps Script?是否有其他方式可以访问用户所在的Google Groups?

谢谢!

编辑

在使用以下代码时,我似乎已经成功进行了身份验证;

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();

当程序运行到最后一行时,整个应用程序会冻结并最终停止工作。我认为这是因为应用程序正在等待Apps Script返回结果?有什么想法如何解决这个问题吗?

顺便提一下,以下是Apps Script代码:

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,它仍然无法工作。

  1. 引用每个实例的错误。
  2. 发布Apps脚本代码?
- TheMaster
第一种方法(1):1. 准确的错误是什么?2. 您是否将脚本部署为API可执行文件? - TheMaster
我使用第一种方法时遇到了401错误,是的,我已经将其部署为API可执行文件。 - PabloJ
如果我的理解是正确的话,这是因为应用程序正在等待Apps Script返回某些内容吗? 如果您的代码成功启动了apps-script代码,它将被记录在Script编辑器>查看>执行中(包括它是API调用),如果失败,则会有错误日志。 - TheMaster
1个回答

1

你没有...在哪里? - Martin Zeitler
我尝试过的第一件事 ^^. 但现在我将尝试使用GoogleAccountCredential而不是GoogleCredential! - PabloJ
你可能还没有部署脚本... 这是通过API运行它的先决条件。 - Martin Zeitler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接