Play Framework 2.2.2 中的 OAuth

Posted

技术标签:

【中文标题】Play Framework 2.2.2 中的 OAuth【英文标题】:OAuth in Play Framework 2.2.2 【发布时间】:2014-04-03 12:29:51 【问题描述】:

我一直在寻找有关如何在 Play 框架(版本 2.2.2)中执行 OAuth 的一些文档,但我真的找不到任何东西。我在一个地方读到它已被弃用,但我也找不到任何关于此的信息。有人知道吗?我想连接到 Twitter API 并在我的应用程序中发出一些数据请求。

【问题讨论】:

【参考方案1】:

您可以在这些开源项目中找到带有 Play Framework 的 OAuth 示例:

securesocial play-silhouette play-authenticate

【讨论】:

【参考方案2】:

它受到支持,实际上非常简单。

这是直接来自Play Docs 的 OAuth 授权示例:

  object Twitter extends Controller 

  val KEY = ConsumerKey("xxxxx", "xxxxx")

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

  def authenticate = Action  request =>
    request.queryString.get("oauth_verifier").flatMap(_.headOption).map  verifier =>
      val tokenPair = sessionTokenPair(request).get
      // We got the verifier; now get the access token, store it and back to index
      TWITTER.retrieveAccessToken(tokenPair, verifier) match 
        case Right(t) => 
          // We received the authorized tokens in the OAuth object - store it before we proceed
          Redirect(routes.Application.index).withSession("token" -> t.token, "secret" -> t.secret)
        
        case Left(e) => throw e
      
    .getOrElse(
      TWITTER.retrieveRequestToken("http://localhost:9000/auth") match 
        case Right(t) => 
          // We received the unauthorized tokens in the OAuth object - store it before we proceed
          Redirect(TWITTER.redirectUrl(t.token)).withSession("token" -> t.token, "secret" -> t.secret)
        
        case Left(e) => throw e
      )
  

  def sessionTokenPair(implicit request: RequestHeader): Option[RequestToken] = 
    for 
      token <- request.session.get("token")
      secret <- request.session.get("secret")
     yield 
      RequestToken(token, secret)
    
  

如果你想签署请求,你可以这样做:

WS.url(s"https://api.twitter.com/1.1/account/verify_credentials.json")
   .sign(OAuthCalculator(Key, RequestToken(token, tokenSecret)))
   .get

请注意,以上内容适用于 OAuth 1.0。 OAuth2 很容易实现,无需专门的库,这也是 Play 人员忽略它的原因。

【讨论】:

作者征求意见 - 你告诉他“很容易实现”~ 这不是很有建设性。

以上是关于Play Framework 2.2.2 中的 OAuth的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework:如何不查看文件夹以了解 Play Framework 中的更改

Play Framework 路由中的变量

Play Framework Routes 中的 Scala 反引号

Play Framework表单中的Scala奇怪类型错误

Play Framework Java 中的 POST 请求

Play Framework中的Silhouette和Deadbolt 2有啥区别