安全顶部

我刚宣布了新的学习春天安全课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程

1.介绍

在本文中,我们首先对OAuth 2.0,OpenID和KeyCloak的快速审查。之后,我们将了解KeyCloak REST A金宝搏官网188bePI以及如何在邮递员中调用它们。

2. OAuth 2.0

OAuth 2.0是一个授权框架,可通过令牌授予经过身份验证的用户授予第三方的访问权限。令牌通常限于有限寿命的范围。因此,它是用户凭据的安全替代品。

OAuth 2.0配有四个主要组件:

  • 资源所有者- 最终用户或拥有受保护资源或数据的系统
  • 资源服务器- 该服务通常通过基于HTTP的API公开受保护的资源
  • 客户- 代表资源所有者调用受保护的资源
  • 授权服务器- 在验证资源所有者后发出OAuth 2.0令牌并将其传送到客户端

OAuth 2.0是一个具有一些标准流动的协议,但我们特别感兴趣在此处的授权服务器组件。

3. OpenID C0NNECT.

Openid Connect 1.0(OIDC)内置在OAuth 2.0的顶部,以向协议添加身份管理层。因此,它允许客户端通过标准的OAuth 2.0流验证最终用户的身份并访问基本配置文件信息。OIDC有向OAuth 2.0引入了一些标准范围, 喜欢Openid.轮廓, 和电子邮件

4. KeyCloak作为授权服务器

JBoss已经开发出来Keycloak.作为基于Java的开源标识和访问管理解决方案。除了OAUTH 2.0和OIDC的支持外,还提供身份经纪,用户联合和SSO等功能。

我们可以用keycloak作为一个带管理控制台的独立服务器或者将其嵌入春季应用程序中。一旦我们在这些方式中的任何一个都有我们的keycloak运行,我们就可以尝试终点。

5. KeyCloak终点

KeyCloak公开了OAuth 2.0流的各种休息端点。

使用这些端点邮差,让我们从创建一个名为“Keycloak.“。然后,我们为keycloak授权服务器URL,Realm,OAuth 2.0客户端ID和客户端密码添加一些键/值条目:

然后,让我们创建一个可以组织keycloak测试的集合。现在,我们已准备好探索可用的端点。

5.1。OpenID配置端点

配置端点就像根目录。它返回所有其他可用的端点,支持的范围和索赔以及签名算法

让我们在邮递员中创建一个请求:{{服务器}}/ auth / realms /{{领域}}/.well-known/openid-configuration。邮递员设定值{{服务器}}{{领域}}从运行时期间从所选环境中获取:

然后我们执行请求,如果一切顺利,我们都有响应:

{“发行人”:“http:// localhost:8083 / auth / realmms金宝搏188体育 / baeldung”,“authorization_endpoint”:“http:// localhost:8083 / auth / realms / baeldung / protocol / Openid-Connect / auth”,“token_endpoint.": "http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/token", "token_introspection_endpoint": "http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/token/introspect", "userinfo_endpoint": "http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/userinfo", "end_session_endpoint": "http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/logout", "jwks_uri": "http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/certs", "check_session_iframe": "http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/login-status-iframe.html", "grant_types_supported": [...], ... "registration_endpoint": "http://localhost:8083/auth/realms/baeldung/clients-registrations/openid-connect", ... "introspection_endpoint": "http://localhost:8083/auth/realms/baeldung/protocol/openid-connect/token/introspect" }

如前所述,我们可以在响应中看到所有可用的端点 - 例如,“authorization_endpoint.“,”token_endpoint.“, 等等。

此外,响应中还有其他有用的属性。例如,我们可以弄清楚所有支持的授权类型grant_types_supported.“或所有支持的范围来自”scopes_supported.“。

5.2。授权端点

让我们继续与授权终点负责OAuth 2.0授权码流。它是可用的“authorization_endpoint”在OpenID配置响应中。

端点是:

{{服务器}}/ auth / realms /{{领域}}/协议/ openid-connect / auth?response_type = code&client_id = jwtclient

而且,这个端点接受范围redirect_uri.作为可选参数。

我们不会在邮递员中使用这个端点。相反,我们通常通过浏览器启动授权码流。然后,KeyCloak如果没有可用的登录cookie,则将用户重定向到登录页面。最后,授权代码被传递给重定向URL。

让我们转到下一步,看看我们如何获得访问令牌。

5.3。令牌终点

令牌端点允许我们检索访问令牌,刷新令牌或ID令牌。OAuth 2.0支持不同的授权类型,如授权_Code.refresh_token,或者密码。

令牌端点是:{{服务器}}/ auth / realms /{{领域}}/协议/ Openid-Connect /令牌

但是,每个授予类型都需要一些专用表单参数。

让我们首先测试我们的令牌端点以获取授权代码的访问令牌。我们必须在请求正文中传递这些表单参数:client_id.client_secret.格兰特_TYPE.代码, 和redirect_uri.。令牌端点也接受范围作为可选参数:

此外,如果我们想要绕过授权码流,那么密码格兰特类型是选择在这里,我们需要用户凭据,因此我们可以在我们的网站或应用程序上有内置登录页面时使用此流程。

让我们创建邮递员请求并传递表单参数client_id.client_secret.格兰特_TYPE.用户名, 和密码在身体里:

在执行此请求之前,我们必须添加用户名密码变量到邮递员的环境键/值对。

另一种有用的补助类型是refresh_token.。当我们从先前调用令牌端点的呼叫有一个有效的刷新令牌时,我们可以使用此功能。刷新令牌流程需要参数client_id.client_secret.格兰特_TYPE., 和refresh_token.

我们需要回应Access_Token.测试其他端点。要加快邮递员的测试,我们可以在帖子中写一个脚本测试我们令牌终点请求的一部分:

var jsondata = json.parse(响应子);postman.setenvironmentVariable(“refresh_token”,jsondata.refresh_token);postman.setenvironmentVariable(“Access_Token”,jsondata.access_token);

5.4。用户信息端点

当我们有一个有效的访问令牌时,我们可以从用户信息端点检索用户配置文件数据。

用户信息端点可用:{{服务器}}/ auth / realms /{{领域}}/协议/ Openid-Connect / UserInfo

让我们创建一个邮递员请求并通过访问令牌授权标题:

然后我们执行请求。这是成功的回复:

{“sub”:“A5461470-33EB-4B2D-82D4-B0484E96AD7F”PROFTER_USERNAME“:”[电子邮件受保护]“,”DOB“:”1984-07-01“,”组织“:”Baeldung“}金宝搏188体育

5.5。令牌内在终点

如果资源服务器需要验证访问令牌是否处于活动状态或想要更多的元数据,特别是为金宝搏官网188be不透明的访问令牌,然后令牌内部端点是答案。在这种情况下,资源服务器将introspt过程与中域进程集成了安全配置

我们调用keycloak的内省终点:{{服务器}}/ auth / realms /{{领域}}/协议/ openid-connect /令牌/ introspect

让我们在邮递员中创建一个内省请求,然后通过client_id.client_secret., 和令牌作为表单参数:

如果是Access_Token.有效,然后我们有我们的回复:

{“exp”:1601824811,“IAT”:1601824511,“JTI”:“D5A4831D-7236-4686-A17B-784CD8B5805D”,“,”ISS“:”http:// localhost:8083 / auth / realms /金宝搏188体育 baeldung“,”sub“:”A5461470-33EB-4B2D-82D4-B0484E96AD7F“,”典型值“:”持票人“,”AZP“:”JWTClient“,”Session_state“:”96030AF2-1E48-4243-BA0B-DD4980C6E8FD“,”Performent_Username“:“[电子邮件受保护]“,”Email_verified“:False,”ACR“:”1“,”范围“:”Profile电子邮件阅读“,”DOB“:”1984-07-01“,”组织“:”Baeldung“,”client_id“:金宝搏188体育“jwtclient”,“用户名”:“[电子邮件受保护]“,”活跃“:真实}

但是,如果我们使用无效的访问令牌,那么响应是:

{“活动”:false}

六,结论

在本文中,使用正在运行的keycloak服务器,我们为授权,令牌,用户信息和introspect端点创建了邮递员请求。

邮递员请求的完整示例可以始终获得在github上

安全底部

我刚宣布了新的学习春天安全课程,包括全部材料专注于春季安全的新OAuth2堆栈5:

>>查看课程
2注释
最老的
最新
内联反馈
查看所有评论
评论在本文上关闭!