配置OAuth协议应用
本文主要介绍如何通过配置标准OAuth2.0协议应用,使IDaaS成为应用的身份源(认证源),实现IDaaS到应用的单点登录。
本文内容主要分为2个部分:
- OAuth2.0协议的工作原理:详细描述了百度智能云IDaaS通过OAuth2.0协议与应用的交互过程,帮助你更好地理解和开发协议。
- 配置OAuth2.0协议应用:完成新建一个OAuth2.0协议模板的应用配置
OAuth2.0协议的工作原理
什么是OAuth2.0协议
OAuth2.0协议官网对OAuth2.0的定义是:
"OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices. This specification and its extensions are being developed within the IETF OAuth Working Group."
OAuth2.0是由IETF OAuth工作组制定的,一种服务于授权的工业级标准协议。该协议通常用于将应用数据安全地授权给调用方使用。也常用于实现应用间的单点登录。
举个日常的例子,比如你在登录百度网盘时,可以使用微信账号进行登录,背后使用的协议即是OAuth2.0,"通过微信登录百度网盘"是你为了方便登录,将自己微信当中的部分数据(头像、昵称等)授权给了百度网盘访问。
对照上述例子,使用IDaaS的OAuth2.0协议应用,你配置的企业应用对应是"百度网盘",而IDaaS代表了"微信",即实现"通过IDaaS账号登录企业应用"。在已经具备IDaaS登录状态的情况下,IDaaS用户可以直接访问所配置企业应用,而不需要二次登录,即实现单点登录。
理解OAuth2.0的授权码模式
概念主体
根据OAuth2.0协议规范,主要有四个主体:
- 授权服务器(Authorization Server):负责颁发Access Token,这里IDaaS是授权服务器。
- 资源所有者(Resource Owner): 企业应用内用户是资源的所有者,授权其他人访问他的资源。这里IDaaS用户需要访问企业应用的资源,在IDaaS侧会维护一个IDaaS用户与企业用户的映射关系。
- 调用方(Client): 调用方请求获取Access Token,经过用户授权后,授权服务器为其颁发Access Token。调用方可以携带Access Token到资源服务器访问用户的资源。这里的调用方是企业应用本身。
- 资源服务器:图中未标注,用于接收Access Token,然后验证被赋予的数据权限,最后返回用户所需访问的资源。
授权流程
常见的OAuth2.0授权流程如下:
- 在企业应用中,用户访问应用内某页面,应用未检查到用户登录状态,浏览器跳转到应用登录页面,用户选择使用"IDaaS登录",跳转到IDaaS登录页;或者在访问应用时,直接跳转到IDaaS登录页,用户在登录页输入用户名密码,完成认证。
- 浏览器接收到一个从IDaaS服务器发来的授权码。
- 浏览器通过重定向将授权码发送到你的应用后端。
- 企业应用服务将授权码发送到IDaaS服务器获取Access Token以及Refresh Token。
- 企业应用后端现在知道了用户的身份,后续可以保存用户信息,重定向到前端其他页面,使用 Access Token访问企业应用的其他页面、资源等。
时序说明
如下是IDaaS使用OAuth2.0单点登录到应用的时序说明,
关键步骤说明
- 第3步中也可以不返回应用登录页而是直接返回302跳转到第6步的IDaaS OAuth2.0登录地址来强制使用IDaaS登录。
- 第5步中,应用应该提前配置好,允许客户选择使用IDaaS认证源来登录。
- 第7步中的登录地址带有一个state参数传递给IDaaS认证源,IDaaS认证源会在第14步中回传这个state参数。
- 第8步中IDaaS的OAuth2.0登录地址为配置OAuth2.0应用中第4步中的【Authorize URL】参数。接口传参均按照标准的OAuth2.0协议。
- 第8步中跳转的认IDaaS证源登录地址后,如果IDaaS发现用户当前没有登录IDaaS,就会先跳到IDaaS登录页做登录(第9步),如果已经登录过了IDaaS就直接进行第13步。
- 第15步中应用调用IDaaS的code校验接口,会传入clientId和clientSecret,在配置OAuth2.0应用第4步中可以获取【clientId】、【clientSecret】和【Discovery Endpoint】,通过Discovery Endpoint可以获取到code校验接口。
- 第16步中token中的sub字段表示认证源侧的用户id,即IDaaS绑定中外部用户id,IDaaS通过这个id来确定要登录到哪个用户。
- 整个流程分为两部分(图中的两个大框),流程可以从第一部分开始,也可以从第二部分开始,从第二部分开始即用户在IDaaS主页,直接发起到应用的单点登录,此时state属性会传配置OAuth2.0应用中配置的state值。
配置OAuth2.0协议应用,并实现单点登录
先决条件
- 开启百度智能云身份管理服务IDaaS;
- 下游应用为OAuth客户端,本身支持OAuth2.0协议,协议开发者需要有OAuth2.0的学习基础。
操作步骤
通过IDaaS的OAuth2.0协议应用,配置实现企业应用与IDaaS的单点登录:即登录一次IDaaS,即可实现应用侧的免登录。详细需要的步骤如下:
- Step1、创建OAuth2.0应用,基于OAuth2模板快速创建应用。
- Step2、获取应用信息,基于配置应用信息主要为获取授权码Code。
- Step3、完成应用侧的开发/配置。
- Step4、授权应用,并测试用户单点登录。
Step1. 创建应用
- 进入IDaaS项目 > 应用 > 应用库,选择标准协议应用,并在OAuth行点击添加;
- 按照弹窗要求,填写对应字段,点击保存并启用;
字段 | 必填 | 说明 |
---|---|---|
应用图标 | 是 | 图片大小不超过1M, 仅支持.png, .jpg格式,建议尺寸60x60 |
应用名称 | 是 | IDaaS项目内唯一,指定后不可以修改 |
应用类型 | 是 | 当前默认仅支持Web应用 |
描述 | 否 | 应用的额外说明信息,不超过128个中文 |
重定向URL | 是 | 即OAuth2.0协议中的Redirect URL字段, 请填写在IDaaS完成登录后,目标应用的跳转URL |
授权模式 | 是 | 当前支持标准的授权码(Authorization Code)模式 |
State | 否 | 用户在应用中的信息,可填写任意字符串 |
Token有效期 | 是 | 范围1-86400(24小时), 默认3600秒(1小时),可保持不变 |
Refresh Token有效期 | 是 | 范围3600-1209600(14天), 默认604800秒(7天) ,可保持不变 |
Step2. 获取应用信息
进入应用 > 应用列表,点击管理进入上一步添加的OAuth应用详情,查看配置的应用信息。 复制Client Id和Client Secret用于应用(OAuth Client)的配置,部分应用若支持使用非对称加密方式,可以通过证书公钥获取接口获取所需公钥信息。
Step3. 完成应用侧协议开发和配置
通过OAuth2.0协议授权Web应用访问IDaaS用户数据的Web流程包含如下3个主要步骤:
- 访问目标应用的用户被重定向到IDaaS获取身份信息;
- 用户在IDaaS完成身份信息校验和授权后,被重定向回需要访问的应用;
- 应用使用IDaaS颁发的Token访问目标资源。
1、重定向获取IDaaS的身份信息
当用户访问目标应用时,应用未检测到用户的登录状态时,会被重定向到IDaaS的登录页面,要求用户输入IDaaS的用户名和密码进行登录。应用跳转IDaaS登录页面时需要调用IDaaS获取code参数接口。
GET https://{idaas_project_url}/app/oauth/{appId}/auth
请求路径可以直接复制Step2中应用信息中的Authorize URL字段。也可以自行填充对应参数,其中,{idaas_project_url}为当前IDaaS项目配置的登录URL,{appId}为当前应用的应用ID字段。
请求参数说明
参数 | 类型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|
client_id | String | 是 | 63f74adehuudeafd0af39401b14c | IDaaS应用创建时中分配的clientId,在应用详细信息内查看 |
response_type | String | 是 | code | IDaaS当前只支持标准的Authorization Code模式,不允许其他类型 |
scope | String | 是 | openid | IDaaS只支持OIDC,scope固定为openid |
redirect_uri | String | 是 | https://login.bce.baidu.com/oauth/XXXXXX | IDaaS登录成功后回调接口地址,必须和应用中配置的重定向URL完全一致 |
state | String | 否 | adueuqdbuebcuabucr | 应用侧用户状态,可以是任意字符串,用于防第三方攻击 |
返回参数说明
授权请求接口不返回参数,IDaaS生成code,并携带生成的code回调上文请求参数中的redirect_uri。
2、完成身份信息校验和授权后,重定向回目标应用
当用户成功登录IDaaS,IDaaS会通过在应用创建时提供的重定向URL,携带一个临时code参数和你在上一步中传递给IDaaS的state参数,此临时code参数的有效期为10分钟。如果state参数不匹配,可能是第三方发起的攻击请求,应用侧应该及时中止此流程。
下一步,应用需要通过IDaaS返回的code参数获取access token:
POST https://{idaas_project_url}/app/oauth/{appId}/token
其中,{idaas_project_url}为当前IDaaS项目配置的登录URL,{appId}为当前应用的应用ID。
参数说明
参数 | 类型 | 必填 | 示例值 | 描述 |
---|---|---|---|---|
client_id | String | 是 | 63f74adjeiefd0af39401b14c | IDaaS创建应用中分配的Client Id |
client_secret | String | 是 | c0540adeude491ad627a01df4521 | IDaaS创建应用时中分配的Client Secret |
code | String | 是 | 235437212 | IDaaS颁发的code |
grant_type | String | 是 | authorization_code | 授权类型,固定为authorization_code |
redirect_uri | String | 是 | https://login.bce.baidu.com/oauth/XXXXXX | 回调地址,必须和应用中配置的重定向URL完全一致 |
codeVerifier | String | 否 | asdfdsdjiuawjegnNgovqwneog | PKCE中的code_verifier,使用S256编码后与code_challenge做比较 |
返回参数示例
{
"scope": "userinfo",
"access_token": "eyJ0eXAiOiJKV1QiL**************TU4MjY0YjA3MDE3ZTM5ZmZhIiwiYXVkIjoiT0F1dGgiLCJpYXQiOjE2MzgzMjc2NTcsImV4cCI6MTYzODMzM TI1NywianRpIjoiZTgwYTA3ZTk1MjUyMTFlYzliYjgzZGNkNmM3ZDQyOTUiLCJ1aWQiOiJkYTZlMzFhMzNkOWM0OTJkOTc3Y2RiYjAzNzZlNjIzOSIsImRpZCI6Ijg0MDE1YTgyYWFiZDQyNWRhYzNlZTViOGYyOTNiY2FlIn0.XCZBGNYdeZ1Z49RsCwSdbttp1qZq9cLvrZOYBCi w036pRJwqLSBepy4GIEX8LWKfmRCEqgcaspMmeFD9Lpx**************07rPuwnU9YF044VwjIPMeOEWNk-ESqGI3SyzsZ1H6QW7qY**************libXcWcihlwL6fxd8G0uHsaE7BKb3AbQGe1hLWXmG8lxmZy96EB8BiLHq3D0oy9y0ZyVD E8hd4oRXM_YwJpU0KwHpUUyHQGiIS9Rk_-8BkFDnW4ZJJOHpQVUqte5b**************uO6tG9f1EZp_w",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "24f**************4b9aceadfdc707",
"id_token": "eyJ0eX**************.eyJpc3MiOiJCY2VJRGFhUyIsInN1YiI6ImJmODk2YTQyOTBhOTQzOTU4MjY0YjA3MDE3ZTM5ZmZhIiwiYXVkIjoiT0**************I6MTYzODMzMTI1NywianRpIjoiZTgwYTA3ZTk1MjUyMTFlYzliYjgzZGNkN mM3ZDQyOTUiLCJ1aWQiOiJkYTZlMzFhMzNkOWM0OTJkOTc3Y2RiYjAzNzZlNjIzOSIsImRpZCI6Ijg0MDE1YTgyYWFiZDQyNWRhYzNlZTViOGYyOTNiY2FlIn0.XCZBGNYdeZ1Z49RsCwSdbttp1qZq9cLvrZOYBCiw036pRJwqLSBepy4GIEX8LWKfmRCEqgcaspMmeFD9LpxPtiq ntV6uTVr5zPWSdp9g6Mf07rPuwnU9YF044**************HlibXcWcihlwL6fxd8G0uHsaE7BKb3AbQGe1hLWXmG8lxmZy96EB8BiLHq3D0oy9y0ZyVDE8hd4oRXM_YwJpU0KwHpUUyHQGiIS9Rk_-8BkFDnW4ZJJOHp QVUqte5bz_F44WCEUAvYufu2s2AB7fk4uO6tG9f1EZp_w"
}
返回参数说明
参数 | 类型 | 示例 | 描述 |
---|---|---|---|
access_token | String | eyJ0eXAiOiJKV1QiLU4MjY0YjA3 | IDaaS返回的Access Token |
token_type | String | Bearer | Token类型 |
expires_in | String | 3600 | Access Token过期时间,单位为秒 |
refresh_token | String | 24f4b9aceadfdc707 | 刷新token |
id_token | String | eyJ0eXeyJpc3MiOiJ | ID Token |
scope | String | openid | 申请的权限范围, 默认为openid |
错误码信息
Httpcode | 错误码 | 错误信息 | 描述 |
---|---|---|---|
400 | invalid_Request | Invalid request | 不合法的请求 |
400 | invalid_ClientIdOrSecret | Invalid client_id or client_secret | 无效的client_id 或 client_secret |
400 | invalid_ResponseType | Invalid response type | 不支持的ResponseType |
400 | invalid_GrantType | invalid grant type | 不支持的 GrantType |
401 | Unauthorized | Unauthorized | 未授权的访问 |
403 | Forbidden | Forbidden | 无权限访问 |
404 | ResourceNotFound | ResourceNotFound | 访问的资源不存在 |
415 | UnsupportedMediaType | UnsupportedMediaType | 不支持的媒体类型 |
500 | InternalError | The request processing has failed due to some unknown error, exception or failure. | 发生未知错误 |
3、应用使用IDaaS颁发的Token访问目标资源
此步骤是在应用内完成,应用通过解析IDaaS返回的access token信息中的sub
字段,获得登录应用的用户id(对应在应用内的身份),从而实现用户的单点登录。
Step4. 授权应用,测试用户单点登录
1、进入配置的应用,点击访问授权页签,为需要使用该应用的用户、用户组或组织进行授权
2、配置用户绑定关系,并测试单点登录。切换页签到绑定关系,选择开启默认绑定属性(指定某个属性来建立IDaaS用户与目标应用用户的绑定关系)或手动配置IDaaS用户和目标应用用户ID的绑定关系。回到基本信息页签,测试单点登录,你也可以直接通过登录应用的方式测试使用IDaaS用户访问目标应用。
3、(可选)配置用户信息同步,将IDaaS用户同步到下游应用,需要下游应用支持SCIM2.0协议,具体配置请参考配置账号信息同步。
后续计划
了解如何配置IDaaS用户到应用用户的信息同步,并自动建立绑定配置账号信息同步。