注意:
- 此教程需要访问 Oracle Cloud。要注册免费账户,请参阅开始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室时,请将这些值替换为特定于云环境的值。
使用 API 签名密钥利用 OCI 身份和访问管理身份域 REST API
简介
与 Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 身份域 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 身份域 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:定义和初始化类
该代码片段定义了一个类 APISignedRequest
,用于使用 API 密钥管理与 OCI IAM 身份域 API 的交互。
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 帮助中心。
Leverage OCI Identity and Access Management Identity Domains REST APIs using API Signing Key
F99708-01
May 2024