Scala+Play2.6的OAuth2.0認(rèn)證--Facebook

本文采用授權(quán)碼模式,參考https://www.cnblogs.com/y-yxh/p/5903771.html
總結(jié)起來就三點(diǎn):
1.請求fb的認(rèn)證url沐旨,fb會(huì)根據(jù)瀏覽器是否已登錄而判斷是否重定向到登陸頁面琴昆,然后以u(píng)rl參數(shù)形式返回code到你提交的回調(diào)地址酬土。
如何請求败潦?下面是一個(gè)例子管行。

 "https://www.facebook.com/dialog/oauth?" +
 "client_id=595xxxxxxx711&" +
 "redirect_uri=http://localhost:9000/fb/auth&" +  //這是在fb app上定義的回調(diào)地址厨埋,要與后臺(tái)方法一致
 "scope=public_profile,user_birthday,email&state=xxxx" //如果需要的話,可以在state上加上參數(shù)(比如加上頁面id等判斷該請求從何頁面而來)

2.拿著返回來的code捐顷,再次請求fb的tokenurl用以交換token荡陷,最后同樣返回access_token到上文的回調(diào)url

"https://graph.facebook.com/oauth/access_token?"+
"client_id=xxx"+
"client_secret=xxx"+
"redirect_uri=xxx"+
"code=xxx"
//這一步需要四個(gè)參數(shù),前兩個(gè)在fb app上迅涮,redirect_uri同上废赞,code是上步拿到的

3.(非必須) 用第2步拿到的access_token請求用戶信息,姓名email等等叮姑。不過既然都第三方認(rèn)證了蛹头,目的基本都是為了用戶信息。

"https://graph.facebook.com/me"



下面上代碼:

  def fbAuth() = Action { request =>
    //不需要的話就不用附帶state參數(shù)請求
    val stateStr = request.getQueryString("state").getOrElse(throw new MsgException(""))
    //回調(diào)地址戏溺,即本方法的url
    val selfUri = "http://" + request.host + request.path
 
    request.getQueryString("code") match {
      case Some(code) =>
        //第二次請求
        val f = ws.url(fb.tokenUrl).addQueryStringParameters( //ws是play.api.libs.ws.WSClient
          "client_id" -> fb.clientId,
          "redirect_uri" -> selfUri,
          "client_secret" -> fb.clientSecret,
          "code" -> code
        ).get().flatMap { response =>
            if (response.status == 200) {
              (response.json \ "access_token").asOpt[String] match {
                case Some(token) =>
                  ws.url(fb.getInfoUrl).addQueryStringParameters( //第三步請求用戶信息
                    "fields" -> fb.getInfoFields,
                    "access_token" -> token
                  ).get().map { userInfo =>
                      if (userInfo.status == 200) {
                        Ok(userInfo.json)
                      } else {
                        BadRequest(userInfo.json)
                      }
                    }
                case _ => Future(Unauthorized)
              }
            } else {
              Future(BadRequest)
            }
          }
        val result = Await.result(f, Duration.Inf)
        result
      case _ => //第一次請求
Redirect(
        s"${fb.requestUrl}?client_id=${fb.clientId}&redirect_uri=$selfUri&scope=${fb.requestScope}&state=$stateStr"
      )
    }
  }

fb.tokenUrl等等部分我寫在了application.conf里渣蜗,如下

fb {
    clientId="5xxxxx1"
    clientSecret="7xxxxxxx2"
    requestUrl="https://www.facebook.com/dialog/oauth"
    requestScope="public_profile,user_birthday,email"
    tokenUrl="https://graph.facebook.com/oauth/access_token"
    #https://graph.facebook.com/me?fields=id,picture,name,birthday,email&access_token=xxx
    getInfoUrl="https://graph.facebook.com/me"
    getInfoFields="id,picture,name,birthday,email"
  }

最后在頁面上會(huì)打印出請求到的用戶信息。



另外也可以把第一步的請求url寫道html的a標(biāo)簽里旷祸「剑考慮到會(huì)暴露client_id以及移植的方便性,未作此處理托享。當(dāng)然fb文檔里也有純前端js方法實(shí)現(xiàn)的認(rèn)證骚烧,由于安全性原因也未采用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闰围,一起剝皮案震驚了整個(gè)濱河市赃绊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羡榴,老刑警劉巖碧查,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡忠售,警方通過查閱死者的電腦和手機(jī)传惠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稻扬,“玉大人卦方,你說我怎么就攤上這事√┘眩” “怎么了盼砍?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逝她。 經(jīng)常有香客問我衬廷,道長,這世上最難降的妖魔是什么汽绢? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮侧戴,結(jié)果婚禮上宁昭,老公的妹妹穿的比我還像新娘。我一直安慰自己酗宋,他們只是感情好积仗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜕猫,像睡著了一般寂曹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上回右,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天隆圆,我揣著相機(jī)與錄音,去河邊找鬼翔烁。 笑死渺氧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹬屹。 我是一名探鬼主播侣背,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慨默!你這毒婦竟也來了贩耐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤厦取,失蹤者是張志新(化名)和其女友劉穎潮太,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虾攻,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡消别,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年抛蚤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寻狂。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岁经,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛇券,到底是詐尸還是另有隱情缀壤,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布纠亚,位于F島的核電站塘慕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蒂胞。R本人自食惡果不足惜图呢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骗随。 院中可真熱鬧蛤织,春花似錦、人聲如沸鸿染。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涨椒。三九已至摊鸡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚕冬,已是汗流浹背免猾。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留囤热,地道東北人掸刊。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像赢乓,于是被迫代替她去往敵國和親忧侧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容