OAuth,本意是做授權(Authorization)管理
OAuth 2.0 是一個授權的流程
OAuth 2.0 Authorization Framework 是 RFC 6749 定義的一套 授權規格,任何程式語言都可以依照此規格實作出自己的授權系統
• 主要用來控制 用戶端 能在 有限範圍內 存取 資源擁有者 的 資源
- 用戶端 = Client = 第三方應用程式、Web API
- 資 源 = Resource = 資料、功能
- 資源擁有者 = 擁有 資源 的人或對象(組織、程式、背景排程)
- 有限範圍內 = 授權需將資源進行一定程度的分類,區分不同範圍
以下情境是林心如在蝦皮網站使用Facebook的快速登入
在以上的範例中
資源伺服器:facebook,
資源擁有者:林心如
Client:蝦皮網站
Client 可能是Web API 也有可能是瀏覽器
是相對於資源擁有者的Clinet端
OAuth 2.0 有4種授權流程
情境1:
User透過瀏覽器,連到一個伺服器,這網站會再去找facebbook進行授權認證拿到token,在這邊該伺服器相對於Facebook就是屬於Client
情境2:
access token 存在前端是不安全的
User透過瀏覽器直接跟Facebook要token,這時候相對於Facebook來說
瀏覽器就是Client,通常這種都是屬於SPA,透過JS直接跟授權伺服器要token
https://notify-bot.line.me/zh_TW/
{
"info": {
"_postman_id": "519b120c-e545-45f7-8209-731a2c8495d3",
"name": "LINE Notify",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "發送 LINE Notify 通知訊息",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "urlencoded",
"urlencoded": [
{
"key": "message",
"value": "Hello World",
"type": "text"
}
]
},
"url": {
"raw": "https://notify-api.line.me/api/notify",
"protocol": "https",
"host": [
"notify-api",
"line",
"me"
],
"path": [
"api",
"notify"
]
}
},
"response": []
},
{
"name": "取得目前 Access Token 狀態",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "https://notify-api.line.me/api/status",
"protocol": "https",
"host": [
"notify-api",
"line",
"me"
],
"path": [
"api",
"status"
]
},
"description": "* [LINE Notify API Document](https://notify-bot.line.me/doc/en/)\n* [管理登錄服務(服務提供者用)](https://notify-bot.line.me/my/services/)\n* [上手 LINE Notify 不求人:一行代碼都不用寫的推播通知方法](https://blog.miniasp.com/post/2020/02/17/Go-Through-LINE-Notify-Without-Any-Code)"
},
"response": []
},
{
"name": "撤銷目前 Access Token",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "urlencoded",
"urlencoded": []
},
"url": {
"raw": "https://notify-api.line.me/api/revoke",
"protocol": "https",
"host": [
"notify-api",
"line",
"me"
],
"path": [
"api",
"revoke"
]
}
},
"response": []
}
],
"auth": {
"type": "oauth2",
"oauth2": [
{
"key": "useBrowser",
"value": true,
"type": "boolean"
},
{
"key": "client_authentication",
"value": "body",
"type": "string"
},
{
"key": "grant_type",
"value": "authorization_code",
"type": "string"
},
{
"key": "tokenName",
"value": "LINE Notify AccessToken",
"type": "string"
},
{
"key": "clientSecret",
"value": "{{ClientSecret}}",
"type": "string"
},
{
"key": "clientId",
"value": "{{ClientID}}",
"type": "string"
},
{
"key": "scope",
"value": "notify",
"type": "string"
},
{
"key": "accessTokenUrl",
"value": "https://notify-bot.line.me/oauth/token",
"type": "string"
},
{
"key": "authUrl",
"value": "https://notify-bot.line.me/oauth/authorize",
"type": "string"
},
{
"key": "state",
"value": "123123",
"type": "string"
},
{
"key": "redirect_uri",
"value": "https://www.getpostman.com/oauth2/callback",
"type": "string"
},
{
"key": "addTokenTo",
"value": "header",
"type": "string"
}
]
},
"event": [
{
"listen": "prerequest",
"script": {
"type": "text/javascript",
"exec": [
""
]
}
},
{
"listen": "test",
"script": {
"type": "text/javascript",
"exec": [
""
]
}
}
]
}
第一步:會先收到Http302轉址
https://access.line.me/dialog/oauth/weblogin?response_type=code&client_id=1476232700&redirect_uri=https%3A%2F%2Fnotify-bot.line.me%2Flogin%2Fcallback&state=8i0I4XQgzWDyLvDWK2aPlo
分析網址內容:https://access.line.me/dialog/oauth/weblogin?response_type=code
response_type = code 走的是授權碼流程
client_id => 代表 LineNotify 這個Client
redirect_uri =>等整個流程走完 會需要透過這個回到LineNotify的網站,這個網址需要先註冊好
state=>亂碼 避免中間人攻擊
第二步:會先收到Http302轉址 取得授權
練習用網站 https://webhook.site/
authorzie endpoint:https://notify-bot.line.me/oauth/authorize
偷偷把redirect_uri 改成以下
https://webhook.site/#!/05f7fee1-51d7-4399-b270-ab182dd66934
第三步:會再收到Http302轉址 取得code
https://webhook.site/05f7fee1-51d7-4399-b270-ab182dd66934?code=UthUbg86Ey8aWYS6J4FaSS&state=123123
他會給一段code
第四步:可以透過code 去跟LINE取得access Token
• 用來<證明存取權限的一組字串,可以讓 資源伺服器 (Resource Server)識別是否為信任的用戶端來源,並允許存取受限範圍的受保護資源
• Access Token 可以存放許多內容,但 OAuth 2.0 並未規範一定要放什麼:
• 不應該存放敏感的使用者資訊,如帳號密碼、信用卡號等等。
• 字串可以為任意格式,只須讓 Resource Server 能夠識別即可
• RFC 6749 定義了 4 種授權的流程
https://datatracker.ietf.org/doc/html/rfc6749?#section-4.1
適合 用戶端 (Client) 位於 受信任 的環境 (大多是 Web 應用程式)
適合 用戶端 (Client) 位於 不受信任 的環境 (大多是 SPA 應用程式)
{ "error": "authorization_pending" }
關於jwt、各個平台的串接實作
之後會專門寫一篇文章跟大家講解
本篇已同步發表至個人部落格
https://moushih.com/2022ithome29/