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)流程
- 引導(dǎo)用戶進(jìn)入授權(quán)頁(yè)面同意授權(quán),獲取code
- 通過(guò)code換取網(wǎng)頁(yè)授權(quán)
access_token
(與基礎(chǔ)支持中的access_token
不同) - 如果需要,開(kāi)發(fā)者可以刷新網(wǎng)頁(yè)授權(quán)
access_token
居灯,避免過(guò)期 - 通過(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ù)一旦被使用則立即失效