Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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 GoogleDriveAPI-OAuth2.0:如何自动化身份验证过程?疑虑_Java_Oauth 2.0_Google Drive Api_Oauth2 Playground - Fatal编程技术网

Java GoogleDriveAPI-OAuth2.0:如何自动化身份验证过程?疑虑

Java GoogleDriveAPI-OAuth2.0:如何自动化身份验证过程?疑虑,java,oauth-2.0,google-drive-api,oauth2-playground,Java,Oauth 2.0,Google Drive Api,Oauth2 Playground,我试图在一个项目(论文项目)中集成GoogleAPI,我有一些疑问和疑问。因此,这里是一个场景: 我用Java编写了一个后端应用程序,它只从命令行运行,与用户完全没有交互。其目标是允许传感器和执行器之间的通信和交互。一切都很好。现在我想集成一些东西,让传感器以一定的周期性和检测到的阈值备份数据。所以我想,为什么不试试谷歌硬盘呢。第一个非常有用的链接是: 快速入门的例子很有魅力。然而,它需要相当多的设置:在开发人员控制台内创建一个项目(因此是一个帐户),启用驱动器API,然后创建客户机ID和客

我试图在一个项目(论文项目)中集成GoogleAPI,我有一些疑问和疑问。因此,这里是一个场景:

我用Java编写了一个后端应用程序,它只从命令行运行,与用户完全没有交互。其目标是允许传感器和执行器之间的通信和交互。一切都很好。现在我想集成一些东西,让传感器以一定的周期性和检测到的阈值备份数据。所以我想,为什么不试试谷歌硬盘呢。第一个非常有用的链接是:

快速入门的例子很有魅力。然而,它需要相当多的设置:在开发人员控制台内创建一个项目(因此是一个帐户),启用驱动器API,然后创建客户机ID和客户机机密。完成这些步骤后,您可以硬编码客户端ID和密码,以形成GoogleDrive的请求URL。然后,我们会要求您在浏览器中输入url,如果您没有登录,则登录,接受并最终将获取访问令牌的授权代码复制并粘贴到控制台中。哇,相当安全的过程。但是,嘿,我完全同意这一点,最重要的是,我们有一个web应用程序、一个智能手机应用程序或一个需要用户身份验证和授权的web服务,以便让应用程序通过访问其他人的帐户来完成其工作。但就我而言,我只希望传感器将数据备份到我的谷歌硬盘上

这些事实引出了我的第一个问题:为了使用GoogleAPI(本例中为驱动器),我是否必须创建一个项目?还是有其他办法?如果我没有错的话,没有其他方法可以在开发人员控制台内创建项目的情况下创建客户机Id和secret。这让我很困惑。为什么我要创建一个基本上使用一些库的项目

因此,让我们假设前面的限制是合理的,然后继续讨论真正的问题:如何自动化身份验证过程?在我的场景中,传感器(简单地说是Java模块)想要备份数据,因此不可能完成所有这些步骤。关于OAuth 2.0的google页面对我们可以嵌入身份验证过程的不同场景有很好的解释,包括一个针对的“输入能力有限的设备”。不幸的是,这比其他更复杂,需要用户切换到具有更丰富输入功能的设备或计算机,启动浏览器,导航到有限输入设备上指定的URL,登录并输入代码。
(LOL)

所以,我没有放弃,我最终写了一篇关于OAuth操场的文章:。对我来说,这真的是一个解决方案,特别是当它说:

NB2。如果您想要一个能够访问的web应用程序,那么这种技术非常有效 您自己的(并且只有您自己的)驱动器帐户,无需费心编写 只能运行一次的授权代码。跳过 步骤1,并在步骤中将“my.drive.app”替换为您自己的电子邮件地址 五,

然而,如果我没有错的话,我认为OAuth仅仅是为了帮助测试和调试使用GoogleAPI的项目,不是吗?此外,Google驱动类,如GoogleAuthorizationCodeFlowGoogleCredential(在Java快速入门示例中使用)总是需要客户机ID、客户机机密等,这使我陷入了零度(创建一个项目并完成整个图形过程)

总之:是否有一种方法可以避免“图形”身份验证交互,并将其转换为只使用驱动器的API而无需用户干预的自动化流程?非常感谢,如果有任何提示、提示、答案、指针,我将不胜感激:-)

我在


它所描述的确实是您用例的解决方案。您错过的关键一点是步骤7,在该步骤中,您将自己的应用程序的详细信息输入到OAuth平台中。从那时起,游乐场将模拟你的应用程序,因此你可以进行一次性授权并获得刷新令牌。

这只是我根据pinoyyid建议编写的代码片段。简单回顾一下在这种情况下我们应该做什么(当您的程序中没有用户交互来完成所有Google GUI身份验证过程时)。如报告所述

  • 转到Google开发者控制台
  • 选择一个项目,或创建一个新项目
  • 在左侧的侧栏中,展开API&auth。接下来,单击API。在API列表中,确保驱动器API的状态为ON
  • 在左侧的侧栏中,选择凭据
  • 在任何一种情况下,您都会进入“凭据”页面,并可以从此处创建项目的凭据

    在凭证页面中,单击OAuth标题下的创建新客户端ID以创建OAuth 2.0凭证。应用程序的客户机ID、电子邮件地址、客户机机密、重定向URI和JavaScript来源位于web应用程序的客户机ID部分

    皮诺伊德的帖子更整洁,直截了当: 注意第7步

    最后,代码片段非常简单,只需发送POST请求,在Java中可以通过多种方式实现。因此,这只是一个例子,我相信还有改进的余地;-)

    //在第一次运行模块时设置访问令牌,以及通常刷新令牌
    公共无效发送邮件(){
    试一试{
    URL=新URL(“https://www.googleapis.com/oauth2/v3/token");
    Map params=新建LinkedHashMap();
    参数put(“客户id”,客户id);
    参数put(“客户机密”,客户机密);
    参数put(“刷新令牌”,刷新令牌);
    参数put(“授予类型”,“重新
    
    // Both to set access token the first time that we run the module and in general to refresh the token
    public void sendPOST(){
      try {
          URL url = new URL("https://www.googleapis.com/oauth2/v3/token");
          Map<String,Object> params = new LinkedHashMap<>();
          params.put("client_id", CLIENT_ID);
          params.put("client_secret", CLIENT_SECRET);
          params.put("refresh_token", REFRESH_TOKEN);
          params.put("grant_type", "refresh_token");
    
          StringBuilder postData = new StringBuilder();
          for (Map.Entry<String,Object> param : params.entrySet()) {
              if (postData.length() != 0) postData.append('&');
              postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
              postData.append('=');
              postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
          }
          byte[] postDataBytes = postData.toString().getBytes("UTF-8");
    
          HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
          conn.setRequestMethod("POST");
          conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
          conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
          conn.setDoOutput(true);
          conn.getOutputStream().write(postDataBytes);
    
          BufferedReader in_rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
    
          // Read response body which should be a json structure
          String inputLine;
          StringBuilder responseBody = new StringBuilder();
    
          while ((inputLine = in_rd.readLine()) != null) {
                  responseBody.append(inputLine);
          }
          in_rd.close();
    
          //Parsing Response --> create a json object
          JSONObject jsonResp = new JSONObject(responseBody);
    
          //Modify previous access token String
          ACCESS_TOKEN = jsonResp.getString("access_token");
    
      }
    
      catch(MalformedURLException ex_URL){
          System.out.println("An error occured: " + ex_URL.getMessage());
      }
      catch(JSONException ex_json) {
          System.out.println("An error occured: " + ex_json.getMessage());             
      }
      catch(IOException ex_IO){
          System.out.println("An error occured: " + ex_IO.getMessage());
      }
    
    } //end of sendRefreshPOST method