Okta 可以用于将以编程方式访问的 API 吗?
Can Okta be used for an API that will be accessed programmatically?
我想了解以下场景是否可以使用 Okta 开发者帐户来完成。我想保护一个用 Python/Flask 编写的 API,这意味着可以由另一个后端服务以编程方式访问。没有用户交互。到目前为止,我所能找到的只是用户被重定向到登录屏幕并且必须手动输入凭据的教程。
我在想也许我可以调用 http://USERNAME.okta.com/api/v1/authn 端点。我用 Postman 做到了这一点,并成功通过了身份验证,并获得了一个会话 ID。此会话 ID 能否用于访问我编写的受“@login_required”装饰器保护的 API 端点?
理想情况下,我希望流程是这样的。
- 服务 A 想要使用我受保护的 Okta API。
- 服务 A 调用一个端点,提供它存储在安全位置的凭据。 (用户永远不会看到登录屏幕/输入凭据/甚至知道 Okta 受保护 API 的存在)
- 我的 Okta 受保护 API 通过 Okta 验证凭据并提供回不记名令牌。
- 服务 A 然后在向受保护的 Okta 发出请求时提供此令牌 API
在针对第三方 API 进行开发时,我已经多次看到这种流程。有可能用 Okta 实现吗?如果是这样,有人可以给我举一个如何做到这一点的例子吗?
谢谢
许多授权流程可用于验证应用程序而不是用户。
例如,您可以使用客户端凭据流。
有关详细信息,请参阅 Okta documentation。
这是 python 中使用 requests-auth (authentication classes to be used with requests). If you are using httpx instead of requests you can use httpx-auth 的示例。
import requests
from requests_auth import OktaClientCredentials
okta = OktaClientCredentials(instance='testserver.okta-emea.com', client_id='54239d18-c68c-4c47-8bdd-ce71ea1d50cd', client_secret="secret")
requests.get('http://www.example.com', auth=okta)
我想了解以下场景是否可以使用 Okta 开发者帐户来完成。我想保护一个用 Python/Flask 编写的 API,这意味着可以由另一个后端服务以编程方式访问。没有用户交互。到目前为止,我所能找到的只是用户被重定向到登录屏幕并且必须手动输入凭据的教程。
我在想也许我可以调用 http://USERNAME.okta.com/api/v1/authn 端点。我用 Postman 做到了这一点,并成功通过了身份验证,并获得了一个会话 ID。此会话 ID 能否用于访问我编写的受“@login_required”装饰器保护的 API 端点?
理想情况下,我希望流程是这样的。
- 服务 A 想要使用我受保护的 Okta API。
- 服务 A 调用一个端点,提供它存储在安全位置的凭据。 (用户永远不会看到登录屏幕/输入凭据/甚至知道 Okta 受保护 API 的存在)
- 我的 Okta 受保护 API 通过 Okta 验证凭据并提供回不记名令牌。
- 服务 A 然后在向受保护的 Okta 发出请求时提供此令牌 API
在针对第三方 API 进行开发时,我已经多次看到这种流程。有可能用 Okta 实现吗?如果是这样,有人可以给我举一个如何做到这一点的例子吗?
谢谢
许多授权流程可用于验证应用程序而不是用户。 例如,您可以使用客户端凭据流。
有关详细信息,请参阅 Okta documentation。
这是 python 中使用 requests-auth (authentication classes to be used with requests). If you are using httpx instead of requests you can use httpx-auth 的示例。
import requests
from requests_auth import OktaClientCredentials
okta = OktaClientCredentials(instance='testserver.okta-emea.com', client_id='54239d18-c68c-4c47-8bdd-ce71ea1d50cd', client_secret="secret")
requests.get('http://www.example.com', auth=okta)