我正在设置keycloak来为某些服务提供保护.外部客户和内部服务将在我的服务上使用相同的端点.
我可以在用户或角色或客户端级别设置令牌到期,还是使用令牌和基本身份验证的混合?
谢谢!
背景:我正在创建一个支持SSO的多个应用程序的云平台.我正在使用Keycloak进行身份验证,使用Netflix Zuul通过Keycloak Spring Security Adapter 进行授权(API Gateway).
每个微服务都需要一个Authorization标头,其中包含一个有效的JWT,它将从中获取用户名(sub)来处理请求.每个微服务到微服务调用应首先通过Netflix Zuul,传递Authorization标头以维持无状态验证.该策略允许每个微服务器知道谁是间接调用微服务的用户(子).
问题/问题1:如果从队列消息中调用微服务会发生什么?我的一个想法是在队列中存储与消息+ userInfo相关的信息,并创建一个专用的微服务来处理这种消息,这种特殊的微服务应该从队列中读取userInfo并处理消息.
更新1:根据另一个论坛的电子邮件回复,将JWT存储在队列中并不是一个好主意,因为它可以轻松挖掘.
问题/问题2:但是,如果之前的特殊微服务想要调用另一个期望在头中接收JWT的普通微服务会发生什么?这个特殊的微服务是否应该由他自己创建一个JWT模仿用户并能够调用常规的微服务?
我认为另一种解决方案是将原始JWT存储在队列中,但是,如果队列稍后调用特殊微服务会发生什么?就在JWT不再有效(它已过期)之后,被调用的微服务将拒绝该请求?
可能的解决方案:(根据JoãoAngelo的讨论更新,见下文)
我应该验证来自我的用户(授权代码流)和我的服务(客户端凭证授权)的请求,这两个请求都应该包含有效负载中的用户信息.当请求来自用户时,我需要验证有效负载用户信息是否与JWT声明匹配.当请求来自服务时,我只需要信任该服务(只要它在我的控制之下).
我非常感谢你的帮助.谢谢.
我在调用端点从angular js 2到widlfly服务器时遇到了这个异常"没有找到publicKey for kid".
验证发生在keycloak中,但是我使用相同的令牌在同一个域内调用来自不同客户端(不同的微服务)的8个端点,但是我只在这个微服务调用中得到了这个例外.
我确信用户拥有所有客户的所有角色.我还在JWT上解码了令牌来验证.
有时它工作,有时没有!这个异常堆栈跟踪:
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:90)
at sun.security.validator.Validator.getInstance(Validator.java:179)
at sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:312)
at sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(X509TrustManagerImpl.java:171)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:184)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
... 55 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)
at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:120)
at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:104)
at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:88)
... 67 more
2017-06-09 00:33:35,994 ERROR [org.keycloak.adapters.rotation.AdapterRSATokenVerifier] (default task-445) Didn't find publicKey for kid: …
Run Code Online (Sandbox Code Playgroud) 我正在使用nodeJS keycloak适配器,到目前为止,我的客户端应用程序重定向到keycloak登录.
尝试登录时,我在keycloak日志中收到错误,如下所示:
12:07:12,341 WARN [org.keycloak.events](默认任务-30)type = CODE_TO_TOKEN_ERROR,realmId = myrealm,clientId = client-test,userId = xxx,ipAddress = xxx.xxx.xxx.xx,error = invalid_code ,grant_type = authorization_code,code_id = xxx,client_auth_method = client-secret
发送回我的快速应用程序的错误消息显示为"无法获取授权代码".
有人能说清楚这意味着什么吗?我只能认为我在我的realm\client\user设置中错误地配置了一些东西.
谢谢
我试图从邮递员那里访问keycloak API.但它显示了400个不良请求.
我用以下格式打电话给api.
http://{hostname}:8080/auth/realms/master/protocol/openid-connect/token?username=admin&password=admin&client_id=admin-cli&grant_type=password
Run Code Online (Sandbox Code Playgroud)
在我设置的标题中 content_type as application/x-www-form-urlencoded
我得到的答复如下.
{
"error": "invalid_request",
"error_description": "Missing form parameter: grant_type"
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助我.任何帮助将不胜感激.提前致谢
一个2岁的keycloak用户列表问题没有答案:
让我们假设系统设计是灵活的,并且作为特定项目经理的投资组合经理的这个事实可以保留在Keycloak(但不是keycloak 组)内或客户端app本身.如何在Keycloak中将其作为基于JavaScrtipt的授权策略实现?我想这个请求可能会以某种方式注入此信息但无法从文档中找出来.
我已经为我的 keycloak 实例启用了谷歌社交登录,但我需要将它用作休息服务。
是否有可用于执行此操作的端点?
我知道有管理 API 可以获取返回用户表示数组的用户列表。
GET /admin/realms/{realm}/groups/{id}/members
Run Code Online (Sandbox Code Playgroud)
返回
https://www.keycloak.org/docs-api/2.5/rest-api/index.html#_userrepresentation
Run Code Online (Sandbox Code Playgroud)
但是有没有办法通过自定义属性来获取用户?
嗨,我正在尝试使用 Keycloak API,但我不太了解它是如何工作的。我想获取一个领域的所有用户。因此,我首先使用此端点获取令牌:/realms/master/protocol/openid-connect/token
在请求正文中使用此参数:
第一个问题是:我应该使用什么客户端?
然后我调用这个端点:/admin/realms/master/users
使用授权标头中的令牌,但我得到一个 403 状态代码,我不明白为什么。
谢谢
我正在设置一个 keycloack 身份验证服务器,以允许授权用户访问受保护的资源 (OAuth2.0)。
访问将通过具有某些限制的嵌入式设备完成。主要限制是访问和刷新令牌如果超过 256 个字符则无法保存。
虽然在OAuth 2.0 授权框架中对令牌大小保持沉默,但所有身份提供者都可以自由决定令牌大小。比如Facebook的token小于256字节,谷歌也是一样。但是对于 keycloack,我得到了一个大约 850 字节的令牌!我已经尝试了管理控制台中可用的几种加密算法,但我仍然得到一个很大的 jwt 令牌。解码 jwt 给出以下内容:
{
"jti": "d654564qsd-5fqsdf5-4qsdf-8b25qs-b556456",
"exp": 1556284611,
"nbf": 0,
"iat": 1556270211,
"iss": "http://myadress:myport/auth/realms/myrealm",
"aud": "myapp",
"sub": "45464-445645-4b45641e-456456-45645646",
"typ": "Bearer",
"azp": "myapp",
"auth_time": 1556269490,
"session_state": "cb95519c-0bf8-4b6b-94e4-a10d9000dbd2",
"acr": "0",
"allowed-origins": [],
"realm_access": {
"roles": [
"user"
]
},
"resource_access": {},
"scope": "readwrite"
}
Run Code Online (Sandbox Code Playgroud)
我实际上对令牌中的数据根本不感兴趣,我也没有解析它。我只需要令牌就可以访问资源。因此,有没有办法将令牌的大小减少到小于 256?如果不是,我能得到的最好结果是什么?
先感谢您
keycloak ×10
java ×3
jwt ×3
javascript ×1
netflix-zuul ×1
oauth-2.0 ×1
openid ×1
postman ×1
rest ×1
token ×1