在安卓上运行应用程序脚本?



我目前正在开发一个Android应用程序,该应用程序要求用户登录Google,然后通过运行应用程序脚本来确定用户是否是Google组的一部分进行验证(除了使用应用程序脚本之外,我还无法弄清楚如何做到这一点(。我能够让用户使用 Firebase 身份验证登录,但无论我尝试什么,我都无法运行应用程序脚本(脚本本身可以工作,因为它可以从浏览器运行(,因为我似乎无法获得正确的授权(我收到 401 和 403 错误(。

以下是我尝试过的一些方法:

  1. 使用 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. 使用 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
    }
    

(在Android中运行Google Apps Script,如何使用Google API在OAuth 2.0中传递"授权"标头值,添加标头以在字符串中发布请求,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));
    

其他一些需要注意的事项:

  • 应用脚本与服务帐号和 Firebase 项目链接到同一 Google Cloud 项目。
  • 客户端密码是为应用脚本 API 生成的。

那么,如何正确进行身份验证以用户身份访问应用程序脚本?有没有其他方法可以访问用户所属的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();

但是当它到达最后一行时,整个应用程序会冻结并最终停止工作。我认为这是因为应用程序正在等待应用程序脚本返回某些内容?关于如何解决这个问题的任何想法?

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

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,它仍然不起作用(。

将适用于 Java 的应用程序脚本 API 客户端库与 oauth2 一起使用:

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

相关内容

  • 没有找到相关文章

最新更新