我目前正在开发一款需要用户登录Google的Android应用程序,并通过运行Apps脚本来验证用户是否属于Google组(我无法找到除使用Apps脚本之外的其他方法)。我可以使用Firebase身份验证让用户登录,但无论我尝试什么,都无法运行Apps脚本(脚本本身能够在浏览器中运行),因为我似乎无法正确获取授权(我得到401和403错误)。
以下是我尝试过的一些方法:
即使我只返回0,它仍然无法工作。
以下是我尝试过的一些方法:
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)
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
:
Using a Firebase Authentication Access Token
GoogleCredential credentials = new GoogleCredential() .createScoped(Arrays.asList(ScriptScopes.GROUPS)) .setAccessToken(FIREBASE_ACCESS_TOKEN);
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();
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
):1. 准确的错误是什么?2. 您是否将脚本部署为API可执行文件? - TheMaster