You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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(刷新令牌)。

授权码模式(适合前端应用或用户交互场景)

分两步完成:

  1. 引导用户跳转到Keycloak授权页面获取授权码:
    http://localhost:8484/auth/realms/my_realm/protocol/openid-connect/auth?client_id=你的客户端ID&redirect_uri=你的回调地址&response_type=code&scope=openid
    
  2. 使用授权码请求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请求的参数或返回内容会暴露在浏览器历史、服务器日志、网络监控中,极易引发安全风险。

实现思路(仅用于测试场景)

  1. 后端服务调用Keycloak的POST接口获取Token
  2. 后端提供一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:01:15