使用 Gmail Java API 使用现有凭据创建 Gmail 实例

Creating a Gmail instance with existing credentials using Gmail Java API

一点背景知识: 我正在尝试使用 Clojure 做一个 API,它将请求用户允许阅读 his/her 电子邮件,然后将执行查询以呈现有序数据。

为此,我正在尝试使用具有现有令牌的 Gmail Java API。

使用 documentation available,我能够发出获取新令牌的请求,但我不知道如何使用之前检索到的令牌创建 com.google.api.services.gmail 的实例。

这是我的相关代码的样子:

(ns linelos.gmail.core
  (:import (com.google.api.client.extensions.jetty.auth.oauth2 LocalServerReceiver)
           (com.google.api.client.googleapis.auth.oauth2 GoogleAuthorizationCodeFlow
                                                     GoogleClientSecrets
                                                     GoogleAuthorizationCodeFlow$Builder)
       (com.google.api.client.auth.oauth2 Credential BearerToken TokenResponse)
       (com.google.api.client.googleapis.javanet GoogleNetHttpTransport)
       (com.google.api.client.http HttpTransport)
       (com.google.api.services.gmail Gmail Gmail$Builder)))

(def ^:private http-transport
  (GoogleNetHttpTransport/newTrustedTransport))

(def ^:private json-factory (JacksonFactory/getDefaultInstance))

(defn get-connection [access-token]
  (let [token-response (-> (TokenResponse.) (.setAccessToken access-token))
    credential     (-> (Credential. (BearerToken/authorizationHeaderAccessMethod))
                       (.setFromTokenResponse token-response))
    ; I'm stuck here
    gmail-builder  (Gmail$Builder. http-transport json-factory ???) 
    gmail          (-> gmail-builder
                       (.setApplicationName app-name)
                       .build)]
    gmail))

我是否还缺少其他东西,比如使用令牌创建请求的助手?

根据他们OAuth 2.0 documentation:

GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
Plus plus = new Plus.builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance(), credential)
    .setApplicationName("Google-PlusSample/1.0")
    .build();

Gmail$Builder 构造函数的第三个参数需要一个 com.google.api.client.http.HttpRequestInitializer(或 null)的实例。他们的 GoogleCredential class 实现了 该接口。您是否尝试过将 credential 作为第三个参数传递(您有 ???)?

类似这样的方法可能有效:

(defn get-connection [access-token]
  (let [token-response (-> (TokenResponse.) (.setAccessToken access-token))
        credential     (-> (Credential. (BearerToken/authorizationHeaderAccessMethod))
                           (.setFromTokenResponse token-response))]
    (-> (Gmail$Builder. http-transport json-factory credential)
        (.setApplicationName app-name)
        (.build))))