使用 Keycloak 进行微服务身份验证

时间:2021-01-22 13:27:50

标签: java spring authentication microservices keycloak

我正在尝试对另一个微服务中的一个微服务请求进行身份验证,但是我找不到任何示例来说明如何在 keycloak 中配置客户端以及如何配置 spring 安全性。这是我要归档的架构:

enter image description here

我已经设法让用户授权工作并保护微服务 A,现在我正在尝试授权来自微服务 B 的请求,但我不知道该怎么做,我是否应该在 keycloak 中创建一个专用用户对于微服务 B,或领域中的客户端,或其他一些技术帐户?是由某个 api 密钥完成的,还是微服务 B 应该像用户一样请求访问令牌?

我的想法是在 Keycloak 中为微服务 B 创建一个客户端,从 Keycloak 请求访问令牌并将其附加到发送到微服务 A 的每个请求中。

这是正确的方法吗?

是否有一些图书馆可以解决这个问题?

我找不到任何与 spring 进行此类通信的示例,您知道有此类示例的任何存储库吗?

1 个答案:

答案 0 :(得分:0)

据我所知,您对 MS-A 的前端访问是通过不同的用户帐户(登录名)完成的。但是对于 MS-B 访问 MS-A,MS-B 总是使用相同的帐户(MS-B 服务帐户)可以吗?

在这种情况下,我将为此后端身份验证创建第二个客户端,我们将其命名为 D:\react tutorial\reactnative\fyp\node_modules\@firebase\firestore\dist\node-cjs\database-21da52c3-e2da0fdd.js:25868 throw replaceFunctionName(e, 'doc()', 'CollectionReference.doc()'); ^ Error [FirebaseError]: Invalid document reference. Document references must have an even number of segments, but datasetSymptom/feels hot/feverish has 3. at new FirestoreError (D:\react tutorial\reactnative\fyp\node_modules\←[4m@firebase←[24m\firestore\dist\node-cjs\database-21da52c3-e2da0fdd.js:209:28) at validateDocumentPath (D:\react tutorial\reactnative\fyp\node_modules\←[4m@firebase←[24m\firestore\dist\node-cjs\database-21da52c3-e2da0fdd.js:19706:15) at doc (D:\react tutorial\reactnative\fyp\node_modules\←[4m@firebase←[24m\firestore\dist\node-cjs\database-21da52c3-e2da0fdd.js:22462:9) at CollectionReference$1.doc (D:\react tutorial\reactnative\fyp\node_modules\←[4m@firebase←[24m\firestore\dist\node-cjs\database-21da52c3-e2da0fdd.js:25864:64) at D:\react tutorial\reactnative\fyp\index2x2.js:1233:37 at Array.forEach (<anonymous>) at Object.<anonymous> (D:\react tutorial\reactnative\fyp\index2x2.js:1231:16) ←[90m at Module._compile (internal/modules/cjs/loader.js:1063:30)←[39m ←[90m at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)←[39m ←[90m at Module.load (internal/modules/cjs/loader.js:928:32)←[39m { code: ←[32m'invalid-argument'←[39m, toString: ←[36m[Function (anonymous)]←[39m } ,并带有以下选项:

OIDC,机密,启用直接访问授权和服务帐户,禁用标准流程

MS-B 现在可以通过对 Keycloak 的简单请求获得访问令牌

backend-client

(不需要用户+密码,所以请确保 curl --request POST \ --url https://keycloak/auth/realms/%realm_name%/protocol/openid-connect/token \ --header 'Accept: */*' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data 'client_id=backend-client&client_secret=%client_secret%&grant_type=client_credentials' 非常安全)

现在需要将访问令牌用于从 MS-B 到 MS-A 的所有请求(client_secret 标头)

我不知道任何 spring 实现/适配器,但我很确定如果您搜索 Authentication: Bearer %Access-Token%,您会找到合适的解决方案