无法使用Directus文档给出的路由通过Keycloak提供商登录,正确的API登录路由是什么?
我明白你遇到的困扰了——Web界面能通过Keycloak正常登录,但调用文档里的路由却报错。其实问题出在OAuth登录的API流程和传统用户名密码登录不一样,Directus的文档可能没把这个细节说透,我来给你捋清楚正确的步骤:
正确的OAuth登录API路由流程
Directus的OAuth2提供商登录是基于重定向授权流程的,不是直接POST到/auth/login/<provider>(这个路由确实不存在),而是分两步走:
1. 第一步:获取授权跳转链接
你需要发起一个GET请求到以下路由,让用户跳转到Keycloak的登录页面:
/auth/oauth/<your-provider-alias>
这里的<your-provider-alias>是你在Directus后台配置Keycloak时设置的ID/别名(不是固定的keycloak,要看你自己的配置)。比如你配置Keycloak时填的ID是keycloak,那路由就是/auth/oauth/keycloak。
请求时要带上redirect_uri参数,指定用户登录Keycloak后要跳转回的你的应用地址,比如:
GET https://your-directus-domain.com/auth/oauth/keycloak?redirect_uri=https://your-app.com/keycloak-callback
2. 第二步:处理回调获取令牌
用户在Keycloak完成登录后,会被自动重定向到你指定的redirect_uri,并且URL里会带上一个code参数。这时候你需要发起POST请求到回调路由,用这个code换取Directus的访问令牌:
POST /auth/oauth/<your-provider-alias>/callback
请求Body需要包含以下参数(用application/x-www-form-urlencoded格式):
code: 回调URL里带的授权码redirect_uri: 和第一步里完全一致的跳转地址
举个具体的例子,假设你的提供商别名是keycloak,回调地址是https://your-app.com/callback,那么请求就是:
POST https://your-directus-domain.com/auth/oauth/keycloak/callback Content-Type: application/x-www-form-urlencoded code=abc123xyz&redirect_uri=https://your-app.com/callback
这个请求会返回包含access_token、refresh_token的响应,之后你就可以用这些令牌调用Directus的其他API了。
为什么Web界面能正常登录?
Directus的前端已经封装了整个OAuth重定向流程:点击登录按钮后自动跳转到Keycloak,登录完成后处理回调并获取令牌,所以你看不到背后的API调用细节。
注意事项
- 一定要确认你用的
<your-provider-alias>和Directus后台配置的Keycloak的ID完全一致(在Directus设置 → Authentication → 找到你的Keycloak配置,查看ID字段) redirect_uri必须和你在Keycloak客户端配置里的“Valid Redirect URIs”以及Directus提供商配置里的“Redirect URI”保持一致,否则会报错
内容的提问来源于stack exchange,提问作者KinitaL

