github编辑

身份验证(废弃)

飞布支持OIDC进行身份验证,实现了OIDC中定义的两种授权流程:基于cookie登录-授权码模式(Authorization Code)和基于Token登录-隐式模式(Implicit)。

支持OIDC Provider

飞布能与任意实现OIDC规范的供应商集成。目前主流OIDC供应商如下:

  • IDaaS服务商auth0、authing等

  • 开源OIDC服务:okta、casdoor等。

快速操作

基本设置

  1. 在身份验证面板中点击“+”,进入OIDC新建页

  2. 首先,输入供应商名称,自动生成 “登录回调 URL”。

  3. 然后,前往AUTHING应用配置页,获取APP ID 、App Secret和Issuer ,分别填入身份验证器表单。

  4. 随后,输入APP ID。

  5. 接着,输入Issuer。输入后,系统自动生成服务发现地址,并从中获取jwksURL和用户端点

  6. 当开发WEB应用时,开启基于cookie的模式,同时填入App Secret。

  7. 当开发移动应用时,开启基于Token的模式。

若JwksURL无法访问,可将JWKS切换到JSON模式,然后输入JSON字符串。

  1. 最后,保存表单,完成配置。

值得注意的是,基于Cookie的登录,需要OIDC供应商(OIDC Provider)和飞布服务器后端(Relying-Party)同时配置回调地址。

首先是,复制 登录回调 URL, 前往AUTHING设置“登录回调 URL”,多个URL可用"英文逗号"分开。

接着,点击“配置登录回调”按钮,前往"设置->安全",设置 "重定向URL"。

系统提供了两个默认值:

  • localhost:9123/#/workbench/userInfo:用户详情页回调URL,用于测试OIDC

  • localhost:9123/#/workbench/rapi/loginBack:API预览页回调URL,用于测试需要授权的API接口。

后续,可根据集成的前端项目,添加对应URL。

回到详情页,点击右上角“测试”按钮。跳转至authing提供的登录页,登录后,可查看当前用户信息。

circle-info

只有开启“基于Cookie”模式后,才能直接测试。

出于安全考虑,在回调至OIDC供应商URL时,系统会自动跳转到HTTPS链接。若想关闭该功能,可关闭 “强制 HTTPS 跳转”。

API设置

  1. 前往API管理面板,选择需要设置的API

    1. 登录访问:切换到设置面板,开启授权,限制API必须登录才能访问

    2. 数据权限:用@fromClaim修饰入参,限制API的数据权限

  2. 点击顶部菜单栏的“预览”,前往API预览页,选择当前API

  3. 输入参数,测试接口,你会发现,接口返回401(这是因为你没登录)

  4. 在预览页顶部,选择OIDC供应商,点击前往登录,登录后可查看用户信息

  5. 重复步骤3,可以看到接口执行成功,有三种情形

    1. 登录访问:未限制数据权限,正常执行,唯一区别是需要用户登录才能执行

    2. 查询请求:限制数据权限,只返回当前用户拥有的数据

    3. 变更请求:限制数据权限,插入数据时绑定当前用户的标识,如UID或EMAIL等

客户端如何使用

构建如下URL,在网页上点击跳转即可。

http://localhost:9991/api/auth/cookie/authorize/<供应商ID>?redirect_uri=<当前页URL>

  • 供应商ID:对应OIDC表单中的供应商ID

  • 当前页URL:对应"设置->安全"中的"重定向URL"

基于TOKEN登录

客户端需要向请求中添加以下请求头:

如何获取TOKEN,可参考Authing的SDKarrow-up-right

工作原理

专业术语

  1. EU(End-User):终端用户

  2. RP(Relying-Party):服务器后端,这里指飞布服务器后端

  3. OP(OIDC Provider): 提供身份验证的服务器,例如Authing 服务器

授权码模式是 OIDC 授权登录中最常用的模式,OP 服务器返回一个授权码 code 给开发者后端服务器,在后端完成 code 换取 access_token,再用 access_token 换取用户信息的操作,从而实现用户的身份认证。

1. 发起登录请求

发起授权需要拼接一个用来授权的 URL,并让终端用户在浏览器中访问,具体参数如下:

circle-info

2.用户登录

发起 OIDC 登录之后,如果用户先前未在 OP 登录过,OP 会将用户重定向到登录页面,引导用户完成在 OP 的认证,此时用户需要选择一种方式进行登录:

authing登录页

3.获取code

OP将验证此用户是否合法,验证通过后会将浏览器重定向到发起授权登录请求时指定redirect_uri 并通过 URL query 传递授权码 code 参数。

4.使用code换取token

飞布默认换取 token 身份验证方式为 client_secret_post,需要向token_endpoint发送POST请求,具体如下:

circle-info

token_endpoint一般从服务发现地址中获取,格式:<Issuer>/.well-known/openid-configuration

5.签发访问令牌

OP将会验证第4步中的请求参数,当验证通过后(校验authorization code是否过期,client idclient secret是否匹配等),OP将向RP返回access token

基于Token登录-隐式模式

OIDC 隐式模式不会返回授权码 code,而是直接将 access_tokenid_token 通过 URL hash 发送到回调地址前端后端无法获取到这里返回的值,因为 URL hash 不会被直接发送到后端。该模式常结合移动应用或 Web App 使用。

1. 用户授权请求

发起隐式模式的授权登录需要拼接一个 URL,并让终端用户在浏览器中访问,不能直接输入认证地址域名。具体参数如下:

circle-info

authorization_endpoint一般从服务发现地址中获取,常见格式:<Issuer>/authorize

服务发现地址:<Issuer>/.well-known/openid-configuration

2.用户授权应用(略)

3.用访问令牌重定向URI

假设用户授予访问权限,跳转后链接示例:

为什么信息在 URL hash 里而不是 query 里?因为 hash 内容不会直接发送到服务器,避免 id_token、access_token 被盗用。

circle-info

1-3步骤为标准流程,不同客户端获取access_token 的流程不同,需要根据实际情况处理。从工程实践中看,常用的另一种方式是直接调用OIDC供应商的登录接口,从中获取access_token。

4.传递给应用程序的访问令牌

浏览器向RP发送access token。RP采用两种方式校验令牌:

  • 公钥签名校验:优先使用使用公钥验证签名。公钥地址(jwks_uri)一般为: <Issuer>/.well-known/jwks.json

  • **在线接口校验:**若公钥验签失败,则调用供应商的token验证接口进行在线验证。userinfo_endpoint?

circle-info

获取用户信息

直到access token 过期或失效之前,RP使用access_token,通过OP的userinfo_endpoint API换取用户信息。如果发起授权登录时的 scope 参数不同,这里的返回信息也会不同,返回信息中的字段取决于 scope 参数。字段符合 OIDC 规范 (opens new window)arrow-up-right,用户信息字段与 scope 对应关系请参考 scope 参数对应的用户信息arrow-up-right

具体请求如下:

circle-info

返回值示例:

circle-info

OIDC规范中不包含角色的描述,因此返回值不涉及roles字段

最后更新于

这有帮助吗?