【问题标题】:Running Apps Script on Android?在 Android 上运行 Apps 脚本?
【发布时间】:2021-05-11 10:41:29
【问题描述】:

我目前正在开发一个 Android 应用程序,该应用程序要求用户登录 Google,然后通过运行 Apps 脚本来验证用户是否属于 Google 群组(我无法弄清楚如何在使用 Apps 脚本之外执行此操作)。我可以让用户使用 Firebase 身份验证登录,但无论我尝试什么,我都无法运行 Apps 脚本(脚本本身可以工作,因为它可以从浏览器运行),因为我似乎无法获得授权权限(我得到 401 和 403 错误)。

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

  1. 使用 Google Apps 脚本 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. 使用 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
    }
    

(Run Google Apps Script in Android, How to pass 'Authorization' header value in OAuth 2.0 with Google APIs, Add header to post request in string, https://developers.google.com/identity/protocols/OAuth2InstalledApp)

我尝试通过以下方式制作credentials

  1. 使用 Firebase 身份验证访问令牌

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

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

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

其他一些注意事项:

  • Apps 脚本与服务帐号和 Firebase 项目链接到同一个 Google Cloud 项目。
  • 为 Apps Scripts API 生成了客户端密码。

那么,我如何正确验证才能以用户身份访问 Apps 脚本?还有其他方法可以访问用户所属的 Google 网上论坛吗?

提前致谢!

编辑

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

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 脚本代码:

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脚本代码?
  • 第一种方法(1): 1.具体错误是什么? 2.您是否将您的脚本部署为 API 可执行文件?
  • 第一种方法出现 401 错误,是的,我已将其部署为 API 可执行文件。
  • I assume this is because the app is waiting for the Apps Script to return something? 如果您的代码成功启动了应用程序脚本代码,它将被记录在 Script editor>view> 执行中(包括它是一个 api 调用)- 如果它在那里失败,那里那里会有错误日志。

标签: android google-apps-script oauth-2.0 firebase-authentication google-apps-script-api


【解决方案1】:

Apps Script API Client Library for Javaoauth2 一起使用:

implementation "com.google.apis:google-api-services-script:v1-rev271-1.25.0"

【讨论】:

  • 你没有……在哪里?
  • 我尝试的第一件事^^。但我现在要尝试使用 GoogleAccountCredential 而不是 GoogleCredential!
  • 你可能还没有部署脚本...这是通过API运行它的前提。
猜你喜欢
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多