附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 憑證、租用戶及區間的範例值。完成實驗室時,請以雲端環境特有的值取代這些值。
使用 API 簽署金鑰運用 OCI Identity and Access Management Identity Domains REST API
簡介
與 Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) Identity Domains API 整合時,OAuth 2.0 是保護 API 要求的最常見方法。不過,在某些使用案例中,特別是簡單性與直接性至關重要時,API 簽署金鑰提供了可行的替代方案。
本教學課程將探討如何使用 API 簽署金鑰呼叫 OCI IAM 識別網域 API,為開發人員和管理員提供更簡單易用的選項。
為什麼要使用 API 簽署金鑰?
API 簽署金鑰提供直接驗證 API 要求的方式。它們很容易產生和使用,因此適用於需要簡單、程式設計存取的應用程式,而不需要複雜的 OAuth 記號交換程序。API 金鑰在下列情況中特別有用:
-
自動化命令檔和 cron 工作:認證的簡單性,無須管理權杖。
-
內部應用程式:降低信任網路內執行之服務的複雜性。
-
原型與開發:快速設定以進行測試與除錯。
適用對象
OCI IAM 專業人員、開發人員和管理員。
目標
使用 API 簽署金鑰運用 OCI IAM 識別網域 REST API。為了有效地示範,您可以使用 Python 程式碼片段來開發命令檔。此命令檔說明如何使用 API 簽署金鑰進行認證,與 OCI IAM 識別網域 API 互動。其中也涵蓋建立群組、建立使用者以及將使用者指派給群組的基本作業,示範如何使用安全 API 要求以程式設計方式執行這些動作。使用 API 金鑰簡化了流程,使這些作業更容易整合到自動化工作流程或指令碼中。
必要條件
-
OCI 帳戶:存取您的 Oracle Cloud Infrastructure 帳戶。
-
API 簽署金鑰:以 PEM 格式簽署要求的公開金鑰組。如需詳細資訊,請參閱 How to Generate an API Signing Key 。
-
熟悉 OCI IAM 和 Python。
-
必須具備 OCI IAM Identity Domains REST API 的知識。
-
具備管理應用程式授權的 OCI IAM 使用者 (識別網域管理員、安全管理員或應用程式管理員)。
-
已安裝 Python 3.x。
-
已安裝
requests
和json
個 Python 套裝軟體。
作業 1:匯入 Python 套裝軟體與初始設定
命令檔的初始部分會設定必要的匯入和組態,以便使用 API 金鑰與 OCI IAM 識別網域 API 互動。
import requests
import json
from oci.config import from_file
from oci.signer import Signer
requests
:Python 中的簡易 HTTP 程式庫,用於發出 HTTP 要求。json
:用於剖析 JSON 資料的程式庫。from_file
:從檔案讀取 OCI 組態的函數。Signer
:使用 API 金鑰簽署 HTTP 要求的類別。
作業 2:定義和初始化類別
此程式碼片段定義使用 API 金鑰管理 OCI IAM 識別網域 API 互動的 APISignedRequest
類別。
class APISignedRequest():
def __init__(self):
global auth
global identity_domain
global config
config = from_file()
auth = Signer(
tenancy=config['tenancy'],
user=config['user'],
fingerprint=config['fingerprint'],
private_key_file_location=config['key_file']
)
identity_domain = 'https://idcs-############################.identity.oraclecloud.com'
APISignedRequest
類別:此類別封裝方法,可對 OCI IAM 識別網域執行 API 要求。init
方法:設定全域變數auth
、identity_domain
和config
來初始化類別。config:
已從預設 OCI 組態檔載入。auth
:用於以 API 金鑰簽署 API 要求的簽署者執行處理。identity_domain
:識別網域執行處理的基本 URL。
作業 3:建立群組方式
APISignedRequest
類別中的 creategroup
方法的設計是在 OCI IAM 識別網域中建立新群組。
def creategroup(self):
extra = "/admin/v1/Groups"
body = {
"displayName": "Example Group",
"externalId": "123456",
"urn:ietf:params:scim:schemas:oracle:idcs:extension:group:Group": {
"creationMechanism": "api",
"description": "Example Description"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group",
"urn:ietf:params:scim:schemas:oracle:idcs:extension:group:Group",
"urn:ietf:params:scim:schemas:extension:custom:2.0:Group"
]
}
response = requests.post(identity_domain + extra, auth=auth, json=body)
jsonresp = json.loads(response.content)
grpid = jsonresp.get("id")
print("Group has been created")
return grpid
creategroup
方法:傳送 POST 要求以在識別網域中建立新群組。extra
:用於建立群組的 API 端點。body
:包含群組詳細資訊的 JSON 有效負載。requests.post
:使用auth
簽署者和body
傳送 POST 要求。json.loads
:剖析 JSON 回應。grpid
:從回應擷取並傳回群組 ID。
作業 4:建立使用者方式
APISignedRequest
類別中的 createuser
方法的設計是在 OCI IAM 識別網域中建立新使用者。
def createuser(self):
extra = "/admin/v1/Users"
body = {
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"name": {
"givenName": "Test",
"familyName": "User"
},
"userName": "testuser@example.com",
"emails": [
{
"value": "testuser@example.com",
"type": "work",
"primary": True
},
{
"value": "testuser@example.com",
"primary": False,
"type": "recovery"
}
]
}
response = requests.post(identity_domain + extra, auth=auth, json=body)
jsonresp = json.loads(response.content)
userid = jsonresp.get("id")
print("User has been created")
return userid
createuser
方法:傳送 POST 要求以在 Oracle 識別網域中建立新使用者。extra
:用於建立使用者的 API 端點。body
:包含使用者詳細資訊的 JSON 有效負載。requests.post
:使用auth
簽署者和body
傳送 POST 要求。json.loads
:剖析 JSON 回應。grpid
:從回應擷取並傳回使用者 ID。
作業 5:將使用者指定至群組方式
APISignedRequest
類別中的 assignuser
方法會處理將使用者指派給 OCI IAM 識別網域中的群組的程序。
def assignuser(self):
extra = "/admin/v1/Groups/"
obj = APISignedRequest()
grpid = obj.creategroup()
gid = str(grpid)
userid = obj.createuser()
body = {
"schemas": [
"urn:ietf:params:scim:api:messages:2.0:PatchOp"
],
"Operations": [
{
"op": "add",
"path": "members",
"value": [
{
"value": userid,
"type": "User"
}
]
}
]
}
response = requests.patch(identity_domain + extra + gid, auth=auth, json=body)
print("User has been assigned to the group")
assignuser
方法:協調建立群組和使用者,然後將使用者指派給群組。extra
:群組作業的 API 端點。creategroup
:建立群組並擷取其 ID。createuser
:建立使用者並擷取其 ID。body
:將使用者新增至群組成員以修正群組的 JSON 有效負載。requests.patch
:傳送 PATCH 要求以新使用者更新群組。
工作 6:執行流程
建立執行處理和呼叫方法:建立 APISignedRequest
的執行處理,並呼叫 assignuser
來執行整個流程。
obj = APISignedRequest()
obj.assignuser()
作業 7:使用 OCI Cloud Shell 中的命令檔
命令檔就緒之後,就可以在本機機器 (已安裝 Python) 或任何支援 Python 開發的整合開發環境 (IDE) 上輕鬆執行。我們使用 OCI Cloud Shell 執行命令檔並取得想要的報表。
- 登入 OCI 主控台,從右上角開啟 OCI Cloud Shell,然後上傳 Python 命令檔
OCIAPISignedRequest.py
。
注意:
OCIAPISignedRequest.py
是使用上述工作程式碼片段開發的 Python 命令檔。
- 執行
python OCIAPISignedRequest.py
命令。
結論
使用 API 金鑰呼叫 OCI IAM 識別網域 API 提供直接的 OAuth 替代方案,適用於簡單性和易用性的特定使用案例至關重要。本教學課程之後,您可以運用 API 金鑰的強大功能進行認證,安全且有效率地與 OCI IAM 識別網域 API 整合。
無論您是要將管理工作自動化、建置內部工具或原型設計應用程式,API 金鑰都能提供靈活方便的方式與 OCI 服務互動。
相關連結
認可
- 作者 - Gautam Mishra (資深雲端工程師)
其他學習資源
瀏覽 docs.oracle.com/learn 的其他實驗室,或前往 Oracle Learning YouTube 頻道存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Leverage OCI Identity and Access Management Identity Domains REST APIs using API Signing Key
F99709-01
May 2024