Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java从浏览器窗口自动返回Google驱动器授权码?_Java_Android_Oauth 2.0_Google Drive Api_Credentials - Fatal编程技术网

如何使用Java从浏览器窗口自动返回Google驱动器授权码?

如何使用Java从浏览器窗口自动返回Google驱动器授权码?,java,android,oauth-2.0,google-drive-api,credentials,Java,Android,Oauth 2.0,Google Drive Api,Credentials,我正在尝试为PC(Java)和Android创建一个利用GoogleDrive的应用程序。为了弄清楚OAuth 2.0是如何工作的,我一直在混淆视听地研究这些示例,但我找不到一个好方法,在用户允许应用程序访问其数据后,自动将授权代码返回给我的程序。Google Drive Quickstart示例使用了一种简单的复制/粘贴机制,需要用户输入,但这对用户来说并不方便 似乎有几种建议的方法可以在不打扰用户的情况下检索授权代码(运行本地web服务器、监视启动的浏览器窗口以进行身份验证等),但Googl

我正在尝试为PC(Java)和Android创建一个利用GoogleDrive的应用程序。为了弄清楚OAuth 2.0是如何工作的,我一直在混淆视听地研究这些示例,但我找不到一个好方法,在用户允许应用程序访问其数据后,自动将授权代码返回给我的程序。Google Drive Quickstart示例使用了一种简单的复制/粘贴机制,需要用户输入,但这对用户来说并不方便

似乎有几种建议的方法可以在不打扰用户的情况下检索授权代码(运行本地web服务器、监视启动的浏览器窗口以进行身份验证等),但Google并不强烈推荐任何解决方案,也没有提供这些解决方案如何在基本描述之外工作的示例。以下指南在第4节中给出了一些建议(注意:我试图引用该节,但由于存在大量链接/图像,因此不允许我引用):

过去有没有人实施过类似的东西,或者有没有最佳实践可以做到这一点?如果可能的话,我更喜欢在多个平台上工作的解决方案(即不使用任何特定于平台的库)


我想,如果用户必须这样做一次(因为我将存储一个刷新令牌并从那时起使用它),这并不是什么大不了的事,但最好有办法解决它

在Oauth2协议中,有两种获取授权代码的方法:通过重定向到您可以控制的url(可以指向您自己的服务或本地主机)或通过复制粘贴

第一种方法是您想要的,大概是使用localhost作为重定向uri,当您从用户机器上的桌面应用程序启动流时。你别无选择,只能让你的应用产生一个能处理
code
url参数的http服务器。然而,你必须要有黑客意识:对于任何可以运行的操作系统,如何从你的应用程序启动web浏览器?您如何处理将用户的计算机配置为拒绝入站http连接的情况


在我看来,最好的做法是进行拷贝粘贴:用户知道会发生什么

我刚刚为Google Drive实现了一个oAuth2解决方案。我最终通过谷歌应用程序引擎创建了一个服务帐户。这里有一个很好的开始链接:

有一个Dr.Edit示例,可以帮助您编辑驱动器对象,如电子表格

GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
            .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)                
            .setServiceAccountScopes(scopes)                
            .setServiceAccountPrivateKeyFromP12File(pk12)
            .setServiceAccountUser(ACCESS_DOMAIN_IMPERSONATE) // <-- set user email here    
            .build();
GoogleCredential-credential=new-GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(服务\帐户\电子邮件)
.setServiceAccountScopes(范围)
.SetServiceAccountPrivateKeyfromP12文件(pk12)

.setServiceAccountUser(ACCESS\u DOMAIN\u IMPERSONATE)//您是否尝试过与此处相同的指南:我一直在使用该示例开始,只是没有一个定义良好的自动返回授权代码的示例。我不太愿意尝试HTTP服务器方法,因为指南确实提到这种方法取决于用户的网络配置。我打算尝试链接中提到的web浏览器路径,但我不确定是否有Java库允许我这样做。您的用户将需要两种路径的浏览器。复制粘贴消除了http服务器的痛苦。只需在应用程序中显示授权URL并要求用户访问它,然后将代码复制粘贴回应用程序中。我的应用程序将要求用户使用其个人帐户登录,因为它需要访问其驱动器存储。听起来服务帐户是用来访问应用程序用户可能希望读取但不希望编辑的文件的。似乎他们不需要身份验证,只需要存储在文件中的密码,因为帐户是应用程序所有的。这不正确吗?有一种方法可以使用服务帐户模拟用户,主要是在您获得google凭据时-请参阅编辑答案中的代码。如果您的用户属于google apps域,则这是有效的答案。如果它是一个普通的谷歌用户,我不认为可以使用服务帐户。我很高兴被证明是错的