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/