scala play twitter api oauth身份验证不起作用

时间:2015-06-17 15:25:57

标签: scala twitter oauth playframework

使用play 2.4通过oauth访问twitter api。 我在twitter上创建了一个应用程序,并创建了带有秘密的密钥和令牌。 在Twitter上为我的应用程序编写了一个URL,因为它实际上并不存在。 并在回调网址上使用相同的组成网址。在localhost上运行应用程序。使用来自twitter的curl生成的命令模仿身份验证按预期工作,因此我的密钥和令牌有效。

我运行代码时收到此响应:

错误401未经授权

这是主要游戏代码:

import play.api._
import play.api.mvc._
import play.api.libs.concurrent.Execution.Implicits._
import play.api.Play.current
import play.api.libs.oauth.{ConsumerKey,RequestToken}
import scala.concurrent.Future
import play.api.libs.ws._
import play.api.libs.oauth.OAuthCalculator
import play.api.libs.iteratee._

class Application extends Controller {

  def index = Action {
    Ok(views.html.index("Your new application is ready."))
  }

  val loggingIteratee = Iteratee.foreach[Array[Byte]] { array => Logger.info(array.map(_.toChar).mkString) }

  def tweets = Action.async {
    credentials.map {
      case (consumerKey, requestToken) =>
        println(consumerKey.key.toString())
        println(consumerKey.secret.toString())
        println(requestToken.token.toString())
        println(requestToken.secret.toString())
        WS
          .url("https://stream.twitter.com/1.1/statuses/sample.json")
          .sign(OAuthCalculator(consumerKey, requestToken))
          .withQueryString("track" -> "reactive")
          .get()
          .map { response =>
            Ok(response.body)
          }
    }getOrElse{
      Future{
        InternalServerError("twitter credentials missing")
      }
    }
  }

  def credentials :Option[(ConsumerKey,RequestToken)] = for {
      apiKey <- Play.configuration.getString("twitter.apiKey")
      apiSecret <- Play.configuration.getString("twitter.apiSecret")
      token <- Play.configuration.getString("twitter.token")
      tokenSecret <- Play.configuration.getString("twitter.tokenSecret")
  }yield (ConsumerKey(apiKey,apiSecret),RequestToken(token,tokenSecret) )

}

2 个答案:

答案 0 :(得分:0)

我认为问题在于您使用了错误的Twitter API。如上所述here,您必须使用Twitter API 1.1,因此您的Web服务的URL应为:.url("https://stream.twitter.com/1.1/statuses/sample.json")

答案 1 :(得分:0)

我的问题一定是我在twitter上创建的Twitter应用程序。删除并重新创建应用程序,它工作正常。我正在使用2.4。我能想到的唯一区别是,当我第一次在twitter上创建应用程序时,我提供了一个实际存在且没有用的组成网址。然后我删除了该应用程序并创建了一个新应用程序,但提供了我的Twitter帐户URL作为Web网址并且它有效。