【问题标题】:Creating a Gmail instance with existing credentials using Gmail Java API使用 Gmail Java API 使用现有凭据创建 Gmail 实例
【发布时间】:2018-07-09 18:16:52
【问题描述】:

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

为此,我正在尝试将 Gmail Java API 与现有令牌一起使用。

使用documentationavailable,我能够发出获取新令牌的请求,但是我不知道如何使用之前检索到的令牌创建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))

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

【问题讨论】:

    标签: java clojure oauth-2.0 gmail-api clojure-java-interop


    【解决方案1】:

    根据他们的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实现该接口。您是否尝试过将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))))
    

    【讨论】:

    • 是的!我用GoogleCredential 替换了我的Credential 实例,它成功了。谢谢!
    猜你喜欢
    • 2020-03-02
    • 2013-02-22
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2015-06-19
    • 1970-01-01
    相关资源
    最近更新 更多