OAuth及授權碼機制介紹

我的個人網站:
http://riun.xyz


簡介

OAuth2.0 是授權機制,用來授權第三方應用,獲取用戶數據。

比如在某些博客網站下方的評論區,經常看到需要使用github登陸然後才能評論,這就使用了OAuth的授權機制。這裏我們把博客網站叫做【第三方應用】,把github叫做【用戶數據所有者】,把使用github登陸然後才能跳轉到博客網站進行評論叫做【授權】。 用戶想要在博客網站的評論區進行評論,那我首先得要知道你是誰才能讓你評論吧,但是我又沒有你的數據,而且我只是需要知道你是誰,顯示你的信息就行了,所以我也不必單獨再做一個用戶登陸系統,那索性我就去別的地方拿你的信息咯,所以我就讓你跳轉到github的登陸頁面,登陸後顯示出請求授權該網站的按鈕,如果你同意並點擊了,那麼博客網站就能從github中拿到你的用戶信息數據,再跳轉到博客頁面,你就可以評論了。評論後顯示的用戶名啊,頭像啊這些東西都是從github中拿到的。

引用阮一峯的OAuth教程中的一句話:簡單說,OAuth 就是一種授權機制。數據的所有者告訴系統,同意授權第三方應用進入系統,獲取這些數據。系統從而產生一個短期的進入令牌(token),用來代替密碼,供第三方應用使用。

令牌與密碼的區別:

令牌 密碼
短期,自動失效 長期,用戶不修改就不變
可以被撤銷,然後立即失效
有權限範圍 完整權限

由於令牌相當於短期的密碼,在固定的時間、權限範圍內可讀(或寫)數據,所以令牌也是不能泄露的。這也是爲什麼令牌生效時間設置的很短的原因。

授權方式

OAuth的目的就是頒發令牌,第三方網站通過令牌可以去用戶數據所有者取數據。下面介紹下四種授權方式,即四種獲取令牌的流程。

  • 授權碼(authorization-code)
  • 隱藏式(implicit)
  • 密碼式(password):
  • 客戶端憑證(client credentials)

不管那種方式,都必須先到第三方網站備案,說明自己的身份。

下面只講解授權碼的方式。具體四種方式,請參考:阮一峯的博客

授權碼的方式:

下面將博客網站作爲A網站,github作爲B網站。

A網站提供一個鏈接:

https://b.com/oauth/authorize?
  response_type=code&
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read
# response_type 要求返回授權碼
# client_id 是實現向B網站備案時,B提供給A的唯一確定身份的碼。必須顯式給出
# redirect_uri B網站接收或拒絕後跳轉的網址。必須顯式給出
# scope 授權範圍

用戶點擊後跳到B網站的登陸頁面,並詢問是否同意授權A網站獲取信息。當用戶同意或拒絕後就會跳到到redirect_uri=CALLBACK_URL裏提供的url

如果同意授權,跳回時,會返回一個授權碼:

https://a.com/callback?code=AUTHORIZATION_CODE
# code 授權碼

然後A網站在後端收到請求後,就可以在後端向B網站請求令牌,

https://b.com/oauth/token?
 client_id=CLIENT_ID&
 client_secret=CLIENT_SECRET&
 grant_type=authorization_code&
 code=AUTHORIZATION_CODE&
 redirect_uri=CALLBACK_URL
# client_id 客戶端ID,同上。必須顯式給出
# client_secret 客戶端密鑰,和client_id獲取方式一樣,不過是保密的。必須顯式給出
# grant_type=authorization_code 表示是授權碼的方式獲取令牌
# code 上一步獲取的授權碼。必須顯式給出
# redirect_uri 獲取令牌後,B網站向此地址發送令牌相關信息

B網站收到獲取令牌的請求,檢查參數正確後,就會頒發令牌:向 redirect_uri 的地址發送一段json數據

{    
  "access_token":"ACCESS_TOKEN",
  "token_type":"bearer",
  "expires_in":2592000,
  "refresh_token":"REFRESH_TOKEN",
  "scope":"read",
  "uid":100101,
  "info":{...}
}
    # access_token 就是令牌

A網站在後端拿到,就可以向B網站的API請求數據。 每個發到 API 的請求,都必須帶有令牌。 具體做法是在請求的頭信息,加上一個Authorization字段,存放令牌信息。

curl -H "Authorization: Bearer ACCESS_TOKEN" \
"https://api.b.com"
# ACCESS_TOKEN 就是令牌

圖:在這裏插入圖片描述

來源:阮一峯的博客

demo

目的:利用OAuth授權完成第三方登陸,最終獲取第三方儲存的用戶數據。

小demo: http://www.ruanyifeng.com/blog/2019/04/github-oauth.html

內容是,利用github登陸授權後獲取用戶信息進行展示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章