【问题标题】:Authenticate own Google account for Blogger API with Java使用 Java 为 Blogger API 验证自己的 Google 帐户
【发布时间】:2016-05-24 00:49:55
【问题描述】:

我想编写一个将本地文件发布到 Google Blogger 的机器人。我将是唯一使用此应用程序的人,因此我不需要设置用户友好的身份验证例程。我花了一个晚上尝试进行设置,但仍在为 OAuth 请求而苦苦挣扎。

我创建了一个新的 Google 应用项目(类型:已安装的桌面应用)并将 Blogger API 添加为范围,然后为我自己的帐户导出了一个客户端机密文件(google-credentials.json,见下文)。

代码:

try
{
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    List<String> scopes = Arrays.asList(BloggerScopes.BLOGGER);

    GoogleClientSecrets secrets = GoogleClientSecrets.load(jsonFactory, new InputStreamReader(Main.class.getResourceAsStream("/google-credentials.json")));

    GoogleCredential credential = new GoogleCredential.Builder().setJsonFactory(jsonFactory)
                                                                .setTransport(httpTransport)
                                                                .setClientSecrets(secrets)
                                                                .build();

    Blogger blogger = new Blogger.Builder(httpTransport, jsonFactory, credential).setApplicationName("jd34app")
                                                                                 .build();

    blogger.blogs().getByUrl("http://jd34blog.blogspot.com").execute();
}
catch (Exception e)
{
    e.printStackTrace();
}

google-credentials.json:

{
  "installed": {
    "client_id": "<removed>",
    "project_id": "<removed>",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_secret": "<removed>",
    "redirect_uris": [
      "urn:ietf:wg:oauth:2.0:oob",
      "http://localhost"
    ]
  }
}

回复:

com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "usageLimits",
    "message" : "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "reason" : "dailyLimitExceededUnreg",
    "extendedHelp" : "https://code.google.com/apis/console"
  } ],
  "message" : "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
}

我也试过 GoogleAuthorizationCodeFlow + GoogleTokenResponse,但不知道在哪里注册令牌响应,因为新的 GoogleCredential().setFromTokenResponse() 似乎是不允许的。

我从 Google 中找到的示例已有多年历史,并且导入 AuthorizationCodeInstalledApp 不是我的依赖项 com.google.apis:google-api-services-blogger:v3-rev50-1.21.0 的类。

【问题讨论】:

    标签: java oauth oauth-2.0 google-api-java-client


    【解决方案1】:

    我遇到了同样的问题,我是这样解决的:

    private static Credential authorize() throws Exception 
       {
       HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
       JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
       List<String> scopes = Arrays.asList(BloggerScopes.BLOGGER);
    
       // load client secrets
      GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, new InputStreamReader(new FileInputStream(clientId_File)));
    
      // set up authorization code flow
      GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
         httpTransport, jsonFactory, clientSecrets, scopes).build();
    
     // authorize
      return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
      }
    
    protected void doTest2() throws Exception 
        {
        // Configure the Installed App OAuth2 flow.
        Credential credential = authorize();
    
        Blogger blogger = new Blogger.Builder(httpTransport, jsonFactory, credential).setApplicationName(APP_NAME).setHttpRequestInitializer(credential)
                .build();
    
        // The request action object.
        GetByUrl blogGetByUrlAction = blogger.blogs().getByUrl(BLOG_URL);
    
        // Configure which blog URL to look up.
        blogGetByUrlAction.setUrl(BLOG_URL);
    
        // Restrict the result content to just the data we need.
        blogGetByUrlAction.setFields("description,name,posts/totalItems,updated");
    
        // This step sends the request to the server.
        Blog blog = blogGetByUrlAction.execute();
    
        // Now we can navigate the response.
        System.out.println("Name: " + blog.getName());
        System.out.println("Description: " + blog.getDescription());
        System.out.println("Post Count: " + blog.getPosts().getTotalItems());
        System.out.println("Last Updated: " + blog.getUpdated());
    }
    

    我还需要在我的 pom.xml(maven 项目)中设置以下依赖项

    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client</artifactId>
        <version>1.20.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client-java6</artifactId>
        <version>1.20.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.oauth-client</groupId>
        <artifactId>google-oauth-client-jetty</artifactId>
        <version>1.21.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.apis</groupId>
        <artifactId>google-api-services-blogger</artifactId>
        <version>v3-rev50-1.21.0</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 2016-12-27
      • 1970-01-01
      • 2012-08-03
      相关资源
      最近更新 更多