前言

在 Keycloak 14.0.0 中,使用 protocol/openid-connect/auth 接口获取授权码时,scope 参数是可选的,但它确实有作用。下面是关于 scope 参数的一些详细信息:

1. scope 参数的作用

  • 定义权限scope 用于声明请求访问的资源和权限。常见的值包括 openidprofileemail 等。
  • 影响返回的数据:如果你在授权请求中指定了某些 scope,在后续的 token 请求中,Keycloak 会根据这些 scope 返回相应的信息。
  • openid用于指示请求者希望使用 OpenID Connect 进行身份验证
  • 获取 ID Token:当你在授权请求中包含 openid 时,Keycloak 会返回一个 ID Token,包含用户的身份信息,反之,scope里不加openid,则不会生成ID Token这个字段。

2. 在不同阶段使用 scope

  • 授权请求阶段 (/protocol/openid-connect/auth):

    • 可以传递 scope 参数,以便在用户同意授权时,明确所请求的权限。
  • 令牌请求阶段 (/protocol/openid-connect/token):

    • 也可以在此阶段传递 scope,但通常情况下,如果在授权请求中已指定 scope,则不需要在此再次指定;
    • 在授权中指定了scope,这里再指定是无效的,以授权中指定的值为准

3. 示例

以下是一个获取授权码的请求示例:

GET /auth/realms/{realm}/protocol/openid-connect/auth?
response_type=code&
client_id={client_id}&
redirect_uri={redirect_uri}&
scope=openid profile

4. 总结

  • 建议:虽然 scope 在授权请求中是可选的,但为了确保获得正确的权限和数据,建议在请求中包含 scope 参数。
  • 注意:在实际开发中,根据你的应用需求合理配置 scope 是非常重要的。

实践

oauth2授权码认证的过程

  • 用户在网站发起登录请求,请求地址为认证中心地址,参数会有scope,client_id,response_type,redirect_uri等
  • 认证中心检查到用户未登录,去表单页,让用户完成认证
  • 表单认证成功后,需要让用户选择公开的字段,对应认证中心的scope
  • 选择scope确认后,根据scope生成code,并重定向到来源页
  • 网站在自己的回调接口中,处理code,并通过code获取认证中心颁发的token
  • 网站通过token,可以获取认证中心的用户信息,信息范围为scope枚举中指定的字段

1. 配置客户端及scope模板

  • 默认模板,无论应用是否传scope,默认模板里的权限都会被启用
  • 可选模板,由用户自己选择,通过scope来体现,它会追加到默认模板后面

2. 获取授权码

  • scope中体现了获取用户的email,这一步是由用户自己选择的公开的信息
  • 地址:/auth/realms/{realm}/protocol/openid-connect/auth?client_id=dahengshuju&scope=profile email&redirect_uri=http://www.baidu.com&response_type=code

3. 表单认证

  • 提示用户输入账号密码进行登录
  • 登录成功后,重定向到来源页,带上code码
  • code授权码使用一次后,立即过期

4. 获取token

  • 通过步骤3,获取到的code,它通过scope来限制授权的范围【即token和获取用户信息中包含的字段集合】
  • 步骤2指定了scope,这一步再指定scope是无效的,二选一即可
  • 地址:/auth/realms/{realm}/protocol/openid-connect/token
  • 请求表类型:x-www-form-urlencoded
  • 请求参数
grant_type:authorization_code
code:3be438fe-8651-4a84-8141-976b76e671e1.75cab95f-a1ec-4b9b-9a6e-8f1ecb651cd6.61d819de-33e4-4006-ae66-dd7609ea2d3e
client_id:dahengshuju
client_secret:9e3de70f-d5cd-4d11-a8aa-85fd3af13265
scope:profile
  • 这是scope为profile email的token
{
"exp": 1727233162,
"iat": 1727231362,
"auth_time": 1727229121,
"jti": "bb296d9d-d521-45b1-aab9-8cb6bea0ddc3",
"iss": "https://xx.xx.com/auth/realms/xx",
"sub": "347c9e9e-076c-45e3-be74-c482fffcc6e5",
"typ": "Bearer",
"azp": "dahengshuju",
"session_state": "75cab95f-a1ec-4b9b-9a6e-8f1ecb651cd6",
"acr": "0",
"scope": "email profile",
"email_verified": false,
"preferred_username": "test",
"locale": "zh-CN",
"email": "bfyxzls@gmail.com"
}
  • 这是scope为profile的token,里面是没有email信息的
{
"exp": 1727233521,
"iat": 1727231721,
"auth_time": 1727229121,
"jti": "f7de8ad9-7558-4f4a-8761-8724f685febb",
"iss": "https://xx.xx.com/auth/realms/xx",
"sub": "347c9e9e-076c-45e3-be74-c482fffcc6e5",
"typ": "Bearer",
"azp": "dahengshuju",
"session_state": "75cab95f-a1ec-4b9b-9a6e-8f1ecb651cd6",
"acr": "0",
"scope": "profile",
"preferred_username": "test",
"locale": "zh-CN"
}

5. 通过access_token获取用户信息

  • 用户信息主要是对token中的内容进行解析
  • 地址:/auth/realms/{realm}/protocol/openid-connect/userinfo
  • 请求头:Authorization: Bearer
{
"sub": "347c9e9e-076c-45e3-be74-c482fffcc6e5",
"email_verified": false,
"preferred_username": "test",
"locale": "zh-CN",
"email": "xxx@gmail.com"
}

keycloak~关于授权码认证中的scope的实践的更多相关文章

  1. keycloak~账号密码认证和授权码认证

    用户名密码登录 POST /auth/realms/demo/protocol/openid-connect/token 请求体 x-www-form-urlencoded grant_type:pa ...

  2. Spring cloud微服务安全实战-5-6实现授权码认证流程(2)

    授权服务器,返回给我一个授权码,这里我只需要把授权传回去就可以了.来证明我是这个服务器. URI的地址传和第一次的地址一样的,认证服务器会比,第一次跳转的请求和第二次申请令牌的请求redirect_u ...

  3. Spring cloud微服务安全实战-5-5实现授权码认证流程(1)

    目前为止已经完成了完整的用户逻辑 目前的问题是,用户在登陆的时候,用户名提交的是给前端服务器的.每个前端服务器的开发人员都可能接触到前端的用户名密码. 每一个客户端应用都要去处理登陆的逻辑,一单我的登 ...

  4. 学习Spring Security OAuth认证(一)-授权码模式

    一.环境 spring boot+spring security+idea+maven+mybatis 主要是spring security 二.依赖 <dependency> <g ...

  5. OAuth2.0授权码模式实战

    OAuth2.0是目前比较流行的一种开源授权协议,可以用来授权第三方应用,允许在不将用户名和密码提供给第三方应用的情况下获取一定的用户资源,目前很多网站或APP基于微信或QQ的第三方登录方式都是基于O ...

  6. Oauth2.0认证---授权码模式

    目录: 1.功能描述 2.客户端的授权模式 3.授权模式认证流程 4.代码实现 1.功能描述 OAuth在"客户端"与"服务提供商"之间,设置了一个授权层(au ...

  7. asp.net权限认证:OWIN实现OAuth 2.0 之授权码模式(Authorization Code)

    asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...

  8. Oauth2认证模式之授权码模式实现

    Oauth2认证模式之授权码模式(authorization code) 本示例实现了Oauth2之授权码模式,授权码模式(authorization code)是功能最完整.流程最严密的授权模式.它 ...

  9. Python Django中QQ邮箱授权码问题

    Python Django中QQ邮箱授权码问题 系统及软件版本如下: Ubuntu Kylin 16.04 Python 3.5.1 Django 1.9.7 PyCharm Community Ed ...

  10. OAuth 2.0 授权码请求

    关于OAuth 2.0,请参见下面这两篇文章(墙裂推荐): <OAuth 2.0> <Spring Security OAuth 2.0> 纸上得来终觉浅,绝知此事要躬行.理论 ...

随机推荐

  1. 靶机练习: hacksudo---Thor

    靶机:hacksudo---Thor 准备工作 靶机地址: http://download.vulnhub.com/hacksudo/hacksudo---Thor.zip MD5 校验:d12168 ...

  2. JavaScript 监听组合按键

    JavaScript监听组合按键   by:授客 QQ:1033553122 1.   思路 如图,通过监听并打印键盘keydown事件,得到图示内容,观察发现, 当按下的组合键包含Ctrl键时,ct ...

  3. Python+requests编写接口用例

    1.python编写接口用例需要依赖requests模块,我们先确认本地是否安装了requests模块,没有安装的先进行安装. pycharm工具查看已安装的模块:File->Setting-& ...

  4. 3、SpringBoot2之配置文件

    3.1.环境搭建 3.1.1.在project创建新module 3.1.2.选择maven 3.1.3.设置module名称和路径 3.1.4.module初始状态 3.1.5.引入springbo ...

  5. 【Phoenix】4.14.1-Hbase-1.3版本 安装

    Phoenix 版本 会附带Hbase版本,要根据安装的Hbase版本下载Phoenix 下载Phoenix wget http://archive.apache.org/dist/phoenix/a ...

  6. 【Mybatis + Spring】 Mybatis - Spring 结合

    环境搭建 EvBuild 软件环境准备 - MySQL 5.0 + - IDEA 2018 + - JDK1.8 + 依赖包相关 - Junit单元测试 - JDBC驱动 - Mybatis 组件 - ...

  7. 【Java-GUI】05 绘图 Part1

    案例: package cn.dzz; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.Acti ...

  8. ChatGPT到底有用没用?—— 个人观点:有用,但不多

    今天接到在大连某高校任职的师弟电话,师弟十分喜欢用ChatGPT,尤其是其文字自动生成的功能,这对于我们这种文字工作者来说简直就是"福音",但是我对这个观点却是有所保留. 当年区块 ...

  9. 最佳实践:解读GaussDB(DWS) 统计信息自动收集方案

    摘要:现在商用优化器大多都是基于统计信息进行查询代价评估,因此统计信息是否实时且准确对查询影响很大,特别是分布式数据库场景.本文详细介绍GaussDB(DWS)如何实现了一种轻量.实时.准确的统计信息 ...

  10. 基于SiliconCloud快速体验GraphRag.Net

    SiliconCloud介绍 SiliconCloud 基于优秀的开源基础模型,提供高性价比的 GenAI 服务. 不同于多数大模型云服务平台只提供自家大模型 API,SiliconCloud上架了包 ...