Leo Yeh's Blog

SAS Viya (105)

教學目標

初步了解 SAS Viya 存取 REST API 驗證和授權的基本概念。

重點概念

首先 SAS Viya 主要使用 SAS Logon Manager 提供身份驗證服務,而 SAS Logon Manager 主要基於 OAuth 2.0 的服務,所謂 OAuth 2.0 主要是一種授權框架,主要能夠讓應用程式有限存取受保護的資源,其工作原理主要是將使用者身份驗證委派給託管使用者帳戶的服務,並且授權第三方應用程式存取使用者帳戶。至於 SAS Viya 所提供的 REST API 主要就是依賴於 SAS Logon Manager 中 OAuth 2.0 的服務來處理需要身份驗證和授權的所有操作,主要有三個步驟,分別為:

  1. SAS 管理員註冊客戶端,並且為開發人員提供客戶端的密鑰。
  2. 開發人員取得 Acces Token,並且請求必須包括先前註冊的客戶端 ID 和密鑰。
  3. 在存取 API 時傳遞 Acces Token,預設有效期間為 12 小時。

透過身份驗證的 Access Token 會在後續的 REST API 請求中傳遞,以利識別使用者是否被授權存取特定資源,如果呼叫中未提供有效的 Acces Token,則操作將失敗,並顯示標準的 401 Unauthorized 回應代碼,此外請注意 SAS Viya 使用 Acces Token 來授權存取特定資料的 REST API 操作。

接著所有使用 SAS Viya REST API 的應用程式和自動化腳本皆必須在 SAS 環境中進行註冊,註冊主要由 SAS 管理員在 SAS Logon Manager 中使用 OAuth 服務正確設定客戶端來處理,設定客戶端主要會先找到有效的 Consul Token,在 SAS Logon Manager 伺服器中主要會向 SAS Configuration Server (Consul) 請求發出 Access Token,此時就會需要 Consul 的 Token,而 SAS 管理員可以在 /opt/sas/viya/config/etc/SASSecurityCertificateFramework/tokens/consul/default 的 client.token 檔案中找到 Consul 的 Token,因此我們能夠在 Linux 作業系統上執行以下指令取得 Consul 的 Token。

1
$ sudo cat /opt/sas/viya/config/etc/SASSecurityCertificateFramework/tokens/consul/default/client.token

當我們從上述指令取得 Consul 的 Token 就能夠透過以下指令呼叫 API 取得 Access Token,並且再透過 Access Token 註冊名為 app 的客戶端,其中 callback 設定為 false,以利在回應中接收 Access Token,否則 Access Token 會被發送到 SAS Configuration Server中註冊的服務,serviceId 主要設定要註冊的客戶的名稱。

1
2
$ curl -X POST "https://<SAS Viya Server URL>/SASLogon/oauth/clients/consul?callback=false&serviceId=app" \
-H "X-Consul-Token: <Consul Token>" --insecure

當我們從上述指令取得回應 JSON 中返回 access_token 欄位的值來註冊新客戶端,其中 authorized_grant_types 主要是設定授權的類型為密碼,client_secret 主要是定義客戶端密鑰,access_token_validity 主要是設定 Access Token 的有效期間 (以秒為單位),預設情況下為 12小時 (或 43200 秒)。

1
2
3
4
5
6
7
8
9
10
$ curl -X POST "https://<SAS Viya Server URL>/SASLogon/oauth/clients" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <Access Token>" \
-d '{
"client_id": "app",
"client_secret": "<Secret>",
"scope": ["openid"],
"authorized_grant_types": ["password"],
"access_token_validity": 86400
}' --insecure

再來已註冊的客戶端主要可以使用 SAS Logon OAuth API 請求 Access Token,當客戶端發出請求對 /SASLogon/oauth/token 端點進行身份驗證,並且傳遞授權形式時,將取得 Access Token,請執行以下指令,其中 grant_type 主要是設定授權許可的方式,目前 SAS Viya REST API 支援密碼授權許多類型。

1
2
3
4
$ curl -X POST "https://<SAS Viya Server URL>/SASLogon/oauth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=password&username=<User ID>&password=<Password>" \
-u "app:<Secret>" --insecure

最後當我們執行完成上述指令時,將會回傳 JSON 格式的結果,其中包含一個名為access_token 的欄位,此時客戶端就能夠透過有效的 Access Token 針對 SAS Viya REST API 進行請求操作,其中 Access Token 主要能夠以 HTTP 授權標頭傳遞給API,請參考以下指令,請注意以下 REST API 主要是取得 SAS Viya 平台中資料夾的資訊,所以 主要是 SAS Viya 平台中資料夾的 ID。

1
2
3
$ curl -X GET "https://<SAS Viya Server URL>/folders/folders/<My Folder ID>" \
-H "Accept: application/json" \
-H "Authorization: Bearer <Access Token>" --insecure

總結我們針對行動裝置的應用和在受信任的環境中進行應用建議使密碼授予的類型,並且s當我們在一開始註冊完成客戶端之後,我們就能夠透過客戶端 ID、客戶端密鑰、使用者帳號和使用者密碼來取得 Access Token,此時我們就能夠透過 Access Token 以 REST API 操作 SAS Viya 平台中被授權存取的資源。

相關資源

⬅️ Go back