OAuth 应用转变为项目身份验证进入服务的授权服务器。登录的项目用户可以批准应用的显式范围,而无需向该应用提供用户密码或上游社交提供商令牌。
#什么是 OAuth 应用
#注册应用
在项目身份验证 UI 中,添加名称、客户端类型、主页、精确重定向 URI 和允许的范围。
| 客户端类型 | 秘密 | PKCE |
|---|---|---|
| 公共 | 没有可部署的客户端密钥 | 所需的 S256 |
| 机密 | 令牌交换时所需的客户端密钥 | 支持和推荐 |
客户端密钥仅显示一次。轮换它会撤销该应用程序的现有 OAuth 令牌。
#授权流程
GET https://api.agihalo.com/api/v1/auth/oauth/authorize
?client_id=halo_client_...
&redirect_uri=https%3A%2F%2Fservice.example.com%2Fcallback
&scope=profile%20email
&state=opaque-client-stateGET 端点验证客户端、重定向 URI 和请求的范围,然后返回您同意 UI 的应用详细信息。用户批准后,使用项目用户访问令牌调用 POST 端点。
curl -X POST https://api.agihalo.com/api/v1/auth/oauth/authorize \
-H "Authorization: Bearer $PROJECT_USER_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"client_id": "halo_client_...",
"redirect_uri": "https://service.example.com/callback",
"scopes": ["profile", "email"],
"state": "opaque-client-state",
"code_challenge": "S256_CHALLENGE",
"code_challenge_method": "S256"
}'响应包含 redirectTo。导航到该确切 URL,以便服务接收 code 和原始state。
#令牌交换
curl -X POST https://api.agihalo.com/api/v1/auth/oauth/token \
-H "Content-Type: application/json" \
-d '{
"grant_type": "authorization_code",
"client_id": "halo_client_...",
"code": "halo_code_...",
"redirect_uri": "https://service.example.com/callback",
"code_verifier": "ORIGINAL_PKCE_VERIFIER"
}'机密客户端也会发送 client_secret。授权码是一次性的,与注册客户端、重定向 URI、项目用户、范围和可选的 S256 质询绑定。
POST
/api/v1/auth/oauth/token授权代码和刷新令牌授予。
#用户信息和范围
GET
/api/v1/auth/oauth/userinfo发送 OAuth 访问令牌作为不记名令牌。 HALO 在返回项目用户信息之前会验证其项目、应用、受众、令牌使用、用户状态和范围。