kestrel 網(wǎng)頁(yè)授權(quán)流程說(shuō)明

kestrel 網(wǎng)頁(yè)授權(quán)

說(shuō)明

  • 本文提到的http://www.kestrel.com 為 授權(quán)服務(wù)器棒拂,視實(shí)際情況進(jìn)行修改
  • 目前提供的調(diào)用的客戶端信息{client_id:"C001", client_secret:"123456"}

網(wǎng)頁(yè)授權(quán)流程

  1. 引導(dǎo)用戶進(jìn)入授權(quán)頁(yè)面同意授權(quán),獲取code
  2. 通過(guò)code換取網(wǎng)頁(yè)授權(quán)access_token(與基礎(chǔ)支持中的access_token不同)
  3. 如果需要,開(kāi)發(fā)者可以刷新網(wǎng)頁(yè)授權(quán)access_token居灯,避免過(guò)期
  4. 通過(guò)網(wǎng)頁(yè)授權(quán)access_token和openid獲取用戶基本信息(支持UnionID機(jī)制)

第一步: 用戶同意授權(quán)径密,獲取code

引導(dǎo)用戶進(jìn)入授權(quán)頁(yè)面,地址如下:

http://www.kestrel.com/oauth/authorize?client_id=CLIENT_ID&response_type=code&redirect_uri=<REDIRECT_URI 接收code的接口地址>&state=STATE

參數(shù)說(shuō)明

參數(shù) 是否必須 說(shuō)明
client_id 第三方應(yīng)用唯一標(biāo)識(shí)
redirect_uri 授權(quán)后重定向的回調(diào)鏈接地址,請(qǐng)使用urlEncode對(duì)鏈接進(jìn)行處理
response_type 返回類型滴铅,請(qǐng)?zhí)顚慶ode
scope api_userinfo (彈出授權(quán)頁(yè)面,可通過(guò)openid拿到用戶信息
state 重定向后會(huì)帶上state參數(shù)就乓,開(kāi)發(fā)者可以填寫a-zA-Z0-9的參數(shù)值汉匙,最多128字節(jié),可用于防范csrf攻擊(參考本文的防范csrf 攻擊)

用戶同意授權(quán)后

如果用戶同意授權(quán),頁(yè)面將跳轉(zhuǎn)至 redirect_uri/?code=CODE&state=STATE生蚁。

code說(shuō)明 : code作為換取access_token的票據(jù)噩翠,每次用戶授權(quán)帶上的code將不一樣,code只能使用一次邦投,有效時(shí)長(zhǎng)5分鐘伤锚。

第二步:通過(guò)code換取網(wǎng)頁(yè)授權(quán)access_token

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=authorization_code&code=<CODE>&redirect_uri=http://www.myapp.com/verifyCode' "http://client_id:client_secret@www.kestrel.com/oauth/token"

參數(shù)說(shuō)明

參數(shù) 是否必須 說(shuō)明
client_id 第三方應(yīng)用唯一標(biāo)識(shí)
client_secret 第三方應(yīng)用appsecret
redirect_uri 回調(diào)鏈接地址,請(qǐng)使用urlEncode對(duì)鏈接進(jìn)行處理
code 填寫第一步獲取的code參數(shù)
grant_type 填寫為authorization_code

返回說(shuō)明:

### 正確時(shí)返回的JSON數(shù)據(jù)包如下
{
    "access_token": "T2tRZERkTWJENkdHbGR2UFBRcTVTT25XRm5ZWlhzWmZXVEt6NWE5QmdKN2Y5RnFpZ2Zac1lTMkRZcFdMWEZaMWhFS0luMFYxN2NjWkp0S3BMMTVLZE9ZRjAzVVVhMQ==",
    "token_type": "bearer",
    "refresh_token": "a308c3c8-7bfa-4270-9d2d-ef3c760720ab",
    "expires_in": 6514,
    "scope": "api_userinfo",
    "openid": "1234567890"
}

### 使用錯(cuò)誤的code時(shí)返回
{
    "error": "invalid_grant",
    "error_description": "Invalid authorization code: 93efc2638ee84281aa7555589450d349"
}

第三步:刷新access_token(如果需要)

由于access_token擁有較短的有效期志衣,當(dāng)access_token超時(shí)后屯援,可以使用refresh_token進(jìn)行刷新,refresh_token有效期為30天念脯,當(dāng)refresh_token失效之后狞洋,需要用戶重新授權(quán)。

獲取第二步的refresh_token后绿店,請(qǐng)求以下鏈接獲取access_token:

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type= refresh_token&scope=api_userinfo&refresh_token=<REFRESH_TOKEN>’ "http://client_id:client_secret@www.kestrel.com/oauth/token"

參數(shù)說(shuō)明

參數(shù) 是否必須 說(shuō)明
client_id 第三方應(yīng)用唯一標(biāo)識(shí)
client_secret 第三方應(yīng)用secret
refresh_token 填寫通過(guò)access_token獲取到的refresh_token參數(shù)
grant_type 填寫為refresh_token

返回說(shuō)明

## 正確時(shí)返回的JSON數(shù)據(jù)包如下:
{
    "access_token": "Nmc1RVR6cGtRNWk2VHJRdkhLblozdVJ3WERPSVc4dzRCc3JLTVhhVHZnYU1aeTZOcEtkZ0UwT3NrTEFzdEtCemRVTkFEcXdBVW1QSVVLUzFnNVkwMmNsMHlDemJRQQ==",
    "token_type": "bearer",
    "refresh_token": "a308c3c8-7bfa-4270-9d2d-ef3c760720ab",
    "expires_in": 7199,
    "scope": "api_userinfo",
    "openid": "1234567890"
}

## 異常
{
    "error": "invalid_grant",
    "error_description": "Invalid refresh token: a308c3c8-7bfa-4270-9d2d-ef3c760720ab1"
}

第四步:拉取用戶信息(需scope為 api_userinfo)

請(qǐng)求方法

http:GET(請(qǐng)使用https協(xié)議) http://www.kestrel.com/demo/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

參數(shù)說(shuō)明

參數(shù) 是否必須 說(shuō)明
access_token 第二步的refresh_token
openid 用戶的唯一標(biāo)識(shí)

有效時(shí)長(zhǎng)說(shuō)明

  • code 有效時(shí)長(zhǎng) 60 * 5 秒 (5分鐘)
  • access_token 有效時(shí)長(zhǎng) 60 * 60 * 2 秒 (2小時(shí))
  • refresh_token 有效時(shí)長(zhǎng) 60 * 60 * 24 * 30 秒(30 天)

防范csrf 攻擊

作為第三方應(yīng)用的開(kāi)發(fā)者吉懊,只需在OAuth認(rèn)證過(guò)程中加入state參數(shù),并驗(yàn)證它的參數(shù)值即可假勿。具體細(xì)節(jié)如下:

  • 在將用戶重定向到OAuth2的Authorization Endpoint去的時(shí)候借嗽,為用戶生成一個(gè)隨機(jī)的字符串,并作為state參數(shù)加入到URL中转培。
  • 在收到OAuth2服務(wù)提供者返回的Authorization Code請(qǐng)求的時(shí)候恶导,驗(yàn)證接收到的state參數(shù)值。如果是正確合法的請(qǐng)求堡距,那么此時(shí)接受到的參數(shù)值應(yīng)該和上一步提到的為該用戶生成的state參數(shù)值完全一致甲锡,否則就是異常請(qǐng)求。
  • state參數(shù)值需要具備下面幾個(gè)特性:
    • 不可預(yù)測(cè)性:足夠的隨機(jī)羽戒,使得攻擊者難以猜到正確的參數(shù)值
    • 關(guān)聯(lián)性:state參數(shù)值和當(dāng)前用戶會(huì)話(user session)是相互關(guān)聯(lián)的
    • 唯一性:每個(gè)用戶缤沦,甚至每次請(qǐng)求生成的state參數(shù)值都是唯一的
    • 時(shí)效性:state參數(shù)一旦被使用則立即失效
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市易稠,隨后出現(xiàn)的幾起案子缸废,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件企量,死亡現(xiàn)場(chǎng)離奇詭異测萎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)届巩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門硅瞧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人恕汇,你說(shuō)我怎么就攤上這事腕唧。” “怎么了瘾英?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵枣接,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我缺谴,道長(zhǎng)但惶,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任湿蛔,我火速辦了婚禮膀曾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘煌集。我一直安慰自己妓肢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布苫纤。 她就那樣靜靜地躺著碉钠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卷拘。 梳的紋絲不亂的頭發(fā)上喊废,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音栗弟,去河邊找鬼污筷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乍赫,可吹牛的內(nèi)容都是我干的瓣蛀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼雷厂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惋增!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起改鲫,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诈皿,失蹤者是張志新(化名)和其女友劉穎林束,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稽亏,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壶冒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了截歉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胖腾。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怎披,靈堂內(nèi)的尸體忽然破棺而出胸嘁,到底是詐尸還是另有隱情,我是刑警寧澤凉逛,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站群井,受9級(jí)特大地震影響状飞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜书斜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一诬辈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荐吉,春花似錦焙糟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至痪欲,卻和暖如春悦穿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背业踢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工栗柒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人知举。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓瞬沦,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親雇锡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逛钻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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