使用OAuth2.0保护REST API - Krishani Indrachapa - Medium
有多种身份验证机制可用于OpenID Connect。然而,OAuth 2.0 由于其独特的优势,在 API 身份验证中更受欢迎。
本文将详细介绍 OAuth 2.0 的基本概念、支持的授权类型,以及如何在没有用户参与的情况下,通过 client_credentials 授权类型实现 API 之间的通信。
什么是 OAuth 2.0?
OAuth 2.0 是一种授权协议,它允许我们为 API 的不同部分或服务定义访问范围(Scopes)。通过使用令牌进行授权,并且令牌会在一段时间后失效,从而降低了攻击者重复利用令牌的可能性。有关 OAuth 2.0 的详细说明,可以参考 Swagger 官方文档。
OAuth 2.0 的授权类型
应用程序可以通过多种方式获取访问令牌,这些方式被称为授权类型(Grant Types)。以下是几种常见的授权类型:
-
授权码(Authorization Code)
用于从令牌端点获取访问令牌。
-
密码(Password)
使用用户名和密码登录,仅适用于第一方应用程序。
-
客户端凭据(Client Credentials)
用于在没有用户上下文的情况下访问应用程序。
-
刷新令牌(Refresh Token)
用于获取新的访问令牌。
作用域(Scopes)
作用域用于限制对特定资源的访问。如果您获得了一个带有特定作用域的访问令牌,则只能执行与该作用域绑定的任务。例如,一个访问令牌可能绑定到 READ 或 WRITE 作用域,或者仅限于 READ。如果客户端尝试使用带有 READ 作用域的令牌调用需要 WRITE 权限的 API 端点,则调用将失败。
使用 client_credentials 授权类型获取访问令牌
在开始之前,您需要在授权服务器(例如 Keycloak)中注册 API。注册完成后,您将获得一个客户端 ID 和客户端密码,例如:
客户端 ID: 34f73973-7f3a-4579-b784-a86e2474b652
接下来,您需要一个有效的承载令牌(Bearer Token)来与启用了 OAuth 的 API 端点通信。以下是使用 client_credentials 授权类型调用授权服务器的示例:
curl -X POST
https:///oauth/token
-H 'Content-Type: application/x-www-form-urlencoded'
-d 'grant_type=client_credentials&client_id=&client_secret='
成功调用后,您将收到类似以下的响应,其中包含访问令牌:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}
使用访问令牌调用 API
获取访问令牌后,您可以将其作为承载令牌调用目标 API 端点。例如:
curl -X GET
https://
-H 'Authorization: Bearer {token}'
请注意,访问令牌有一定的有效期。当令牌过期后,您需要重新获取一个新的访问令牌。
通过本文的介绍,您应该对 OAuth 2.0 的基本概念和使用方法有了更深入的了解。无论是保护 REST API,还是实现安全的服务间通信,OAuth 2.0 都是一个强大的工具。
原文链接: https://krishaniindrachapa.medium.com/securing-rest-api-with-oauth2-0-f76af74aa030
最新文章
- Kimi K2 API 调用全指南:解锁国产大模型的强大能力
- Amazon的API描述语言Smithy概述
- 向日葵开放平台:如何让远程办公和支持变得轻而易举?
- 常见的api认证方式:应用场景与优势
- AI推理(Reasoning AI)技术趋势2025:从大模型到智能体的全面升级
- Dify 全链路实战:三步搭建智能天气查询机器人(Agent+DeepSeek + 高德天气)
- 2025年GitHub开源生成式 AI API 项目盘点:Open WebUI、FastAPI LLM Server、Text Generation WebUI API
- WebSocket和REST的区别:功能、适用范围、性能与示例解析
- 9个最佳Text2Sql开源项目:自然语言到SQL的高效转换工具
- 深入解析API网关策略:认证、授权、安全、流量处理与可观测性
- GraphQL API手册:如何构建、测试、使用和记录
- 自助式入职培训服务API:如何让企业管理更上一层楼?