「万事开头难,视频号500粉直播需要你的助力!你的支持是我前进的动力!」
来源:juejin.cn/post/7299736066423930914
基于 OAuth2 建设 Open API 平台授权机制,通过安全标准的方式授权给外部,保证部门应用数据的安全性。
OAuth2 定义了4种授权方式,但目前只需要供客户端在后台调用即可,所以仅考虑凭证式授权方式。
整体流程示意图:
下面按照上面提到的四大模块来进行分析:
客户端通常是第三方服务,通过 Open API 获取资源。
客户端获取资源步骤:
第一步,用户需要在开放平台登录,然后注册客户端凭证,注册过程中给该凭证指定权限范围(Scope),注册完后会生成 client_id 和 client_secret,其中 client_secret 需要保密管理。
第二步,利用上一步拿到的 client_id 和 client_secret 发起请求获取令牌。
第三步,调用 API ,并在请求头上附带令牌。
令牌会过期,过期后重新请求获取令牌即可。
❝区分两种权限类型:
API 权限,用户创建客户端凭证时指定(Scope)
数据权限,继承用户的数据权限
授权服务负责授权和维护客户端凭证与权限的关系。
依赖 spring-security-oauth2-authorization-server 组件来构建该服务。
❝spring-security-oauth2-authorization-server 组件里面提供了基于 OAuth2 实现的授权服务,开箱即用.
库表介绍
oauth2_registered_client:spring-security-oauth2-authorization-server 组件依赖的表,记录已注册了的客户端凭证。
oauth2_authorization:spring-security-oauth2-authorization-server 组件依赖的表,记录已生成的令牌。
oauth2_user_registered_client_relation:记录用户和客户端凭证的关系。
oauth2_scope:权限范围(模块),支持两个层级。
oauth2_open_api:记录对外API清单以及与 scope 的关系。
各个表的关系如下:
授权
目前仅支持凭证式授权方式,不需要刷新令牌,令牌过期后重新获取即可。
spring-security-oauth2-authorization-server 组件内置了授权接口 /oauth/token。
JWT
令牌使用 JWT 生成,使用 JWT 的好处是:
JWT 是一种自包含结构,可以存放一些关键信息,不需要额外查询。仅使用 JWT 令牌即可完成校验令牌有效性的动作。
JWT 令牌由客户端来保管,且在里面存放客户端信息,服务器端不需要维护客户端状态,有利于服务端的无状态化和水平扩展。
JWT 令牌通过签名来防止信息被篡改。
坏处是:
虽然信息不能被篡改,但是还是有泄漏的风险,建议对内容进行加密。
❝JWT 可以到 JWT.IO网站解析。
网关是客户端访问的唯一入口,是外部请求连接内部服务的桥梁,授权,鉴权,路由都在这里完成。
网关处理两类请求,一类是请求,一类是请求。
授权(获取令牌)请求
这类请求逻辑比较简单,网关接收到后直接路由到授权服务。
获取资源请求
此类请求需要网关先到授权服务获取到权限信息,鉴权通过后再路由到资源服务。
注意,网关对鉴权通过的请求在路由前会设置请求头 ,,作用有两个:
可以通过这两个请求头判断是否是 Open API 请求。
资源服务可以从这两个请求头获取到 client_id 和 user_id 信息。
资源服务是实际的资源提供者。
请求来到资源服务代表鉴权已经通过,可以通过请求头 和 来获取 Open API 调用者 client_id 和对应的 user_id 信息。
获取令牌
请求接口:
请求方式:POST
请求头:
请求参数:
响应字段:
响应示例:
获取资源
获取资源请求需要包含 请求头,示例:
其中,
代表令牌类型,后面跟着访问令牌。
这里给一些 API 权限配置示例(只是建议)