博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
play2.0实现新浪OAuth2.0
阅读量:7217 次
发布时间:2019-06-29

本文共 2080 字,大约阅读时间需要 6 分钟。

hot3.png

最近有个项目要使用微博联合登录,看了下java版的 sdk, 太麻烦了,本来就不太懂java, 人都凌乱了,oauth2授权流程不是很复杂,就自己写实现下吧,就当练手了。

库代码

package libs.oauth2import play.api.libs.concurrent._import play.api.libs.ws._import play.core.parsers._import play.api.libs.json._case class OAuthKey(key:String, secret:String)case class AccessToken(token:String)case class AccessTokenError(error:String, errorCode:Int, request:String)case class OAuth2(authorizationUrl: String, accessToken: String, redirectUri: String, key:OAuthKey){  def authorization(responseType:String, params:Map[String, String]) = {    val ism = if(authorizationUrl.indexOf("?") > 0) "&" else "?"    authorizationUrl+ism+"client_id="+key.key+"&response_type="+responseType+"&redirect_uri="+java.net.URLEncoder.encode(redirectUri, "utf-8")  }    def getAccessToken(code:String):Either[AccessToken, AccessTokenError] = {    val rs = WS.url(accessToken).withQueryString(         ("client_id", key.key)        ,("client_secret", key.secret)        ,("grant_type", "authorization_code")        ,("redirect_uri", redirectUri)        ,("code", code)).post("content").value.get.body    var jsonRs = Json.parse(rs)    if(rs.indexOf("error") > 0){      Right(AccessTokenError((jsonRs \ "error").as[String],(jsonRs \ "error_code").as[Int], (jsonRs \ "request").as[String]  ))    }else{      Left(AccessToken((jsonRs \ "access_token").as[String]))    }  }    }

附上用例

object login extends Controller {val oauth2 = OAuth2(      "https://api.weibo.com/oauth2/authorize",      "https://api.weibo.com/oauth2/access_token",      "http://xx.com/login/sinare",      OAuthKey("key", "secret")      );def sina = Action{    Redirect(oauth2.authorization("code",Map()))  }def sinare = Action{ implicit request =>     request.queryString.getOrElse("code", "".toSeq).mkString match {      case code:String if !code.isEmpty => {        oauth2.getAccessToken(code) match{          case Left(t) => {             Ok("token:"+t.token)          }          case Right(error) => Ok("error"+error.error)        }      }      case _ => Ok("error")    }  }}

转载于:https://my.oschina.net/u/131466/blog/77528

你可能感兴趣的文章
20160519
查看>>
SCU 3132(博弈)
查看>>
正则表达式
查看>>
delete archivelog all 无法彻底删除归档日志?
查看>>
Redis五大数据类型
查看>>
大型分布式网站架构技术总结
查看>>
矩阵求导与投影梯度相关问题
查看>>
SVN
查看>>
C语言编程写的一个http下载程序(王德仙)2012-04-08
查看>>
CCF201409-3 字符串匹配(100分)
查看>>
UVALive2203 UVa10042 Smith Numbers【质因数分解+素数判定+数位之和】
查看>>
Project Euler Problem 9: Special Pythagorean triplet
查看>>
HDU5701 中位数计数【中位数】
查看>>
Python 深浅拷贝 (Shallow copy and Deep copy in Python)
查看>>
Axure
查看>>
屏幕截取工具
查看>>
C语言第七次作业---要死了----
查看>>
Jquery事件绑定冲突
查看>>
偶现bug如何处理?
查看>>
yum命令简介
查看>>