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