如何在Keycloak中获取Access Token、Refresh Token及请求适配问题
Keycloak Token 相关问题解答
1. 如何在Keycloak中获取Access Token和Refresh Token?
Keycloak支持多种OAuth2/OIDC授权模式获取Token,以下是两种最常用的方式:
密码模式(适合后端服务或信任环境)
直接通过用户名密码请求Token,请求方式为POST:
curl -X POST http://localhost:8484/auth/realms/my_realm/protocol/openid-connect/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=password" \ -d "client_id=你的客户端ID" \ -d "client_secret=你的客户端密钥" \ -d "username=用户账号" \ -d "password=用户密码"
返回的JSON结果中会包含access_token(访问令牌)和refresh_token(刷新令牌)。
授权码模式(适合前端应用或用户交互场景)
分两步完成:
- 引导用户跳转到Keycloak授权页面获取授权码:
http://localhost:8484/auth/realms/my_realm/protocol/openid-connect/auth?client_id=你的客户端ID&redirect_uri=你的回调地址&response_type=code&scope=openid - 使用授权码请求Token:
curl -X POST http://localhost:8484/auth/realms/my_realm/protocol/openid-connect/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=authorization_code" \ -d "client_id=你的客户端ID" \ -d "client_secret=你的客户端密钥" \ -d "code=获取到的授权码" \ -d "redirect_uri=你的回调地址"
2. 是否可以获取POST请求的Token内容,通过GET请求展示在页面上?
可以实现,但强烈不建议在生产环境这么做——Token属于敏感信息,GET请求的参数或返回内容会暴露在浏览器历史、服务器日志、网络监控中,极易引发安全风险。
实现思路(仅用于测试场景)
- 后端服务调用Keycloak的POST接口获取Token
- 后端提供一个GET接口,将获取到的Token返回并渲染到页面
示例(Node.js/Express):
const express = require('express'); const axios = require('axios'); const app = express(); // 封装获取Keycloak Token的函数 async function fetchTokens() { try { const resp = await axios.post( 'http://localhost:8484/auth/realms/my_realm/protocol/openid-connect/token', new URLSearchParams({ grant_type: 'password', client_id: '你的客户端ID', client_secret: '你的客户端密钥', username: '用户账号', password: '用户密码' }), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ); return { accessToken: resp.data.access_token, refreshToken: resp.data.refresh_token }; } catch (err) { console.error('Token获取失败:', err); throw err; } } // 提供GET接口展示Token app.get('/display-tokens', async (req, res) => { try { const tokens = await fetchTokens(); res.send(` <div style="padding: 20px;"> <h2>Keycloak Tokens</h2> <h3>Access Token</h3> <pre style="white-space: pre-wrap;">${tokens.accessToken}</pre> <h3>Refresh Token</h3> <pre style="white-space: pre-wrap;">${tokens.refreshToken}</pre> </div> `); } catch (err) { res.status(500).send('Token获取失败,请检查配置'); } }); app.listen(3000, () => { console.log('测试服务运行在 http://localhost:3000/display-tokens'); });
安全提醒
生产环境中,应遵循以下规范:
- Refresh Token仅由后端存储,绝不暴露给前端
- Access Token通过HTTPS传输,前端优先存放在HttpOnly Cookie或内存中,避免存入localStorage
- 禁止通过GET请求传递或展示Token
内容的提问来源于stack exchange,提问作者SoN
相关产品推荐
相关产品推荐

