2

我正在写一个播放应用(斯卡拉)和我试图执行由叽叽喳喳这里列出的反向AUTH步:https://dev.twitter.com/docs/ios/using-reverse-auth如何在Scala Play Framework中进行Twitter反向验证?

步骤听起来像一个普通的RetrieveRequestToken到https://api.twitter.com/oauth/request_token与附加参数设置的x_auth_mode = reverse_auth

我玩的框架使用Sign-Post(https://code.google.com/p/oauth-signpost/),我想知道如何利用WS库和Sign-Post来实现这一点。

这里是我想出了:

val KEY = ConsumerKey(Play.configuration.getString("twitter.consumer.key").getOrElse("XXXX"),    Play.configuration.getString("twitter.consumer.secret").getOrElse("XXXX")) 

    def reverse = Action.async { 
    val oauth_calc = OAuthCalculator(KEY, RequestToken("","")) 
    oauth_calc.setSigningStrategy(new oauth.signpost.signature.AuthorizationHeaderSigningStrategy) 
    var reverse_request : Future[Response] = WS.url("https://api.twitter.com/oauth/request_token").sign(oauth_calc) 
     .post(Map("x_auth_mode" -> Seq("reverse_auth")))  
     reverse_request.map{ 
     response => { 
      Logger.debug(response.body) 
      Ok("Here") 
     } 
     } 
    } 

我得到不过“无法验证的OAuth签名和令牌”

回答

4

所以,我在这里找到了部分答案:https://stackoverflow.com/a/20635782/143733 我有使用apache默认的HttpClient,因为在Play WS类或Sign-Post中似乎没有办法做到这一点。

这里是我想出了最后的异步执行:

object Twitter extends Controller { 

    val KEY = ConsumerKey(Play.configuration.getString("twitter.consumer.key").getOrElse("XXXX"), 
         Play.configuration.getString("twitter.consumer.secret").getOrElse("XXXX")) 

    val TWITTER_SERVICE_INFO = ServiceInfo(
    "https://api.twitter.com/oauth/request_token", 
    "https://api.twitter.com/oauth/access_token", 
    "https://api.twitter.com/oauth/authorize", KEY) 

    val TWITTER = OAuth(TWITTER_SERVICE_INFO,false) 

    /*** 
    * The following is the reverse oauth step outlined by twitter 
    */ 
    def reverse = Action.async { 

    val client = new DefaultHttpClient(); 
    val params = new java.util.ArrayList[BasicNameValuePair](1) 
    params.add(new BasicNameValuePair("x_auth_mode", "reverse_auth")) 
    val consumer = new CommonsHttpOAuthConsumer(KEY.key, KEY.secret) 
    val post = new HttpPost(TWITTER_SERVICE_INFO.requestTokenURL) 
    post.addHeader("Content-Type", "application/x-www-form-urlencoded") 
    post.setEntity(new UrlEncodedFormEntity(params)) 
    consumer.sign(post) 

    val futureBodyString: Future[String] = future { 
     val response = client.execute(post) 
     EntityUtils.toString(response.getEntity()) 
    } 

    futureBodyString.map { 
     body => { 
     Ok(body) 
     } 
    } 

    } 


}