【问题标题】:OAuth2 authorization from Java/Scala using google gdata client API使用谷歌 gdata 客户端 API 从 Java/Scala 进行 OAuth2 授权
【发布时间】:2014-12-19 19:23:14
【问题描述】:

您将如何使用等效的 Java api 执行与 Google .Net sample at subsection "Performing OAuth 2.0" 相同的流程?

我尝试使用 Java api 模拟的那个 .Net 示例似乎适合发送 api 请求以创建授权 url,然后假设我将在浏览器中使用该 url 来获取访问代码......从而允许服务器-之后使用 google 电子表格 api 的辅助代码,用于该一个 google 帐户。

我发现的壁橱 Google Java api 类是 OAuthHelper,但它似乎在实例化时需要 userAuthorizationUrl,这实际上是我希望通过它自己的 createUserAuthorizationUrl method 从它获得的将设法实例化它 - 对我来说有点循环难题。这似乎表明我在假设中遗漏了一些东西,可能这不是用于模仿 .Net 代码示例的正确类。

非常感谢您的帮助。

【问题讨论】:

标签: oauth-2.0 google-api google-oauth google-spreadsheet-api


【解决方案1】:

看起来http://soatutorials.blogspot.co.at/2013/08/google-spreadsheet-api-connecting-with.html 有它用于 Java。

Scala 解决方案代码,由http://javatoscala.com/ 提供:

package com.articlio.googleApi
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import com.google.gdata.client.GoogleService;
import com.google.gdata.client.authn.oauth.GoogleOAuthHelper;
import com.google.gdata.client.authn.oauth.GoogleOAuthParameters;
import com.google.gdata.client.authn.oauth.OAuthException;
import com.google.gdata.client.authn.oauth.OAuthHmacSha1Signer;
import com.google.gdata.client.authn.oauth.OAuthRsaSha1Signer;
import com.google.gdata.client.authn.oauth.OAuthSigner;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.SpreadsheetFeed
import com.google.gdata.data.BaseEntry;
import com.google.gdata.data.BaseFeed;
import com.google.gdata.data.Feed;
import com.google.gdata.util.AuthenticationException;
import com.google.gdata.util.ServiceException;

//remove if not needed
import scala.collection.JavaConversions._

object OAuth2Sample {

  def loginOAuth2(clientID: String, clientSecret: String) {
    val SCOPES = "https://docs.google.com/feeds https://spreadsheets.google.com/feeds"
    val oauthParameters = new GoogleOAuthParameters
    oauthParameters.setOAuthConsumerKey(clientID) //
    var signer: OAuthSigner = null
    oauthParameters.setOAuthConsumerSecret(clientSecret) //
    signer = new OAuthHmacSha1Signer()
    val oauthHelper = new GoogleOAuthHelper(signer)
    oauthParameters.setScope(SCOPES)
    try {
      oauthHelper.getUnauthorizedRequestToken(oauthParameters)
    } catch {
      case e: OAuthException => e.printStackTrace()
    }
    val requestUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters)
    println(requestUrl)
    println("Please visit the URL above to authorize your OAuth " + 
      "request token.  Once that is complete, press any key to " + 
      "continue...")
    try {
      System.in.read()
    } catch {
      case e: IOException => e.printStackTrace()
    }
    var token: String = null
    try {
      token = oauthHelper.getAccessToken(oauthParameters)
    } catch {
      case e: OAuthException => e.printStackTrace()
    }
    println("OAuth Access Token: " + token)
    println()
    var feedUrl: URL = null
    try {
      feedUrl = new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full")
    } catch {
      case e: MalformedURLException => e.printStackTrace()
    }
    println("Sending request to " + feedUrl.toString)
    println()
    val googleService = new SpreadsheetService("oauth-sample-app")
    try {
      googleService.setOAuthCredentials(oauthParameters, signer)
    } catch {
      case e: OAuthException => e.printStackTrace()
    }
    val feed = googleService.getFeed(feedUrl, classOf[SpreadsheetFeed])
    val spreadsheets = feed.getEntries
    println("Response Data:")
    println("=====================================================")
    if (spreadsheets != null) {
      for (spreadsheet <- spreadsheets) {
        println(spreadsheet.getTitle.getPlainText)
      }
    }
    println("=====================================================")
    println()
    println("Revoking OAuth Token...")
    try {
      oauthHelper.revokeToken(oauthParameters)
    } catch {
      case e: OAuthException => e.printStackTrace()
    }
    println("OAuth Token revoked...")
  }
}

但是,对于 scala,您目前还需要申请 this...

【讨论】:

  • 刷新令牌?该博客文章看起来很方便,但缺少刷新令牌。拥有使用刷新令牌创建新访问令牌的代码会很好,因为访问令牌很快就会过期(1 小时后)。无论如何,不​​错的帖子,+1。
猜你喜欢
  • 2013-09-05
  • 2012-08-08
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 2015-02-01
  • 2011-10-26
相关资源
最近更新 更多