Authing 知识库
🛠 开发资源🥂 集成案例🔭 常见问题🖥 控制台
3.0.0
3.0.0
  • 欢迎
  • Authing 概述
  • 快速开始
    • 注册 Authing 开发者账号
    • 第一个应用
    • 基础概念
    • 实现单点登录
    • 控制台概览
    • 部署模型和价格
    • 最佳开发实践
    • 我该如何选择 Authing 的技术
  • 进阶指南
    • 理解认证和授权
      • 用户名 - 密码认证
      • 邮箱 - 密码认证
      • 手机 - 验证码认证
      • JWT Token 释义及使用
    • 验证 Token
    • 配置用户权限
    • 迁移老数据进 Authing
    • 错误代码
  • 认证
    • 接入 OAuth 2.0
      • 创建 OAuth 应用
      • 使用 OAuth 授权
    • 接入 OpenID Connect
      • 创建 OIDC 应用
      • 使用 OIDC 授权
      • 理解 OIDC 流程
      • OIDC 常见问题
    • 接入 SAML
      • 创建 SAML Identity Provider 应用
      • 创建 SAML Service Provider 应用
      • 理解 SAML 流程
      • 同时使用 Authing 作为 SP 和 IdP
      • 使用 SAML Identity Provider
        • 在阿里云访问管理中使用
        • 在腾讯云访问管理中使用
        • 在 Auth0 中使用
      • 使用 SAML Service Provider
        • 与 Auth0 SAML IdP 对接
        • 与 SSOCircle SAML IdP 对接
    • 接入 LDAP
      • 配置 LDAP 服务
      • 使用 Authing 的 LDAP 用户目录
    • 接入 Active Directory
  • 社会化登录
    • 接入 Web 端社会化登录
      • GitHub 登录
      • 微信 PC 扫码登录
      • 微信 APP 内网页登录
      • 企业微信(第三方应用)网页授权登录
      • 企业微信(第三方应用)扫码登录
      • 企业微信(企业内部)扫码登录
      • 新浪微博登录
      • 钉钉登录
      • QQ 登录
      • 配置登录授权 Scope
    • 接入移动端社会化登录
      • 微信登录
      • 支付宝登录
    • 接入小程序登录
      • 小程序登录
        • 用户登录凭证(code)最佳实践
      • APP 拉起小程序登录
    • 打通微信账号体系
  • 扫码登录
    • 小程序扫码登录
      • 接入私有化小程序
    • APP 扫码登录
      • 快速接入
      • Web 端 SDK
      • 完整接口列表
      • 自定义配置项
      • 扫码登录原理
  • 移动应用登录
    • 移动应用 SSO
      • 自动检测登录
      • 唤起 App 登录
    • 移动应用身份提供商
  • 授权
    • Authorization 基础概念
      • 什么是基于角色的管理(RBAC)
      • 什么是基于属性的管理(ABAC)
      • 什么是零信任网络
    • Authorization at Authing
    • 接入 RBAC
    • 接入 ABAC
    • 接入组织机构管理
  • 扩展能力
    • 自定义认证流程(Pipeline)
      • 创建你的第一个 Pipeline 函数
      • Pipeline 函数开发指南
      • 应用场景
      • user 对象
      • context 对象
      • 使用环境变量
      • 可用的 Node Modules
      • 如何调试
      • Node SDK
      • GraphQL API
      • 常见问题
      • 私有化部署
    • 使用 Webhook
    • 自定义用户字段
  • 开发资源
    • 开发资源
    • API(GraphQL)
    • Guard for Web
      • 自定义 Guard 的 UI 样式
    • Guard for Mobile
      • Guard for React Native
    • Guard VS 自定义 UI
    • SDK for 单点登录
    • SDK for JavaScript
      • 查询用户权限
      • 绑定社会化登录
      • 自定义用户字段
      • 管理 MFA 口令
      • 自定义请求链接
    • SDK for Node.js
      • 权限控制
      • 查询用户权限
      • 组织机构管理
      • 老版权限控制(deprecated)
      • Pipeline 函数
      • 自定义用户字段
      • 绑定社会化登录
      • 管理 MFA 口令
      • 自定义请求连接
    • SDK for React Native
    • SDK for 微信小程序
    • SDK for Java
    • SDK for Objective-C
    • SDK for Python
    • SDK for Go
    • SDK for PHP
    • 函数计算(FaaS)
  • 通信
    • 邮件
    • SMS
  • MFA
    • 配置 MFA 安全口令
      • 使用 Microsoft Authenticator 添加 MFA 令牌
    • 接入 MFA
  • 安全
    • 配置 Web 安全域
    • 配置用户池密码强度
    • 配置密码加密函数
  • 其他
    • 常见问题
    • 集成案例
      • Authing 与 AWS 集成案例
      • 函数计算与 AaaS 集成案例
      • Odoo 集成案例
      • 社会化登录集成案例
    • 社交互联数据
    • 为 Authing 贡献 SDK
      • 了解 Authing 的模块
Powered by GitBook
On this page
  • 理解 OIDC 流程
  • 什么时候需要认证?
  • 什么时候需要授权?
  • OIDC 流程

Was this helpful?

  1. 认证
  2. 接入 OpenID Connect

理解 OIDC 流程

Previous使用 OIDC 授权NextOIDC 常见问题

Last updated 5 years ago

Was this helpful?

理解 OIDC 流程

本文为读者讲述 OIDC 认证协议的几种认证模式,包括授权码模式、隐式模式、混合模式;还有 OIDC 授权在业务中的触发、处理方式。配有流程图辅助理解。

什么时候需要认证?

当你的用户需要访问服务器上受保护资源的时候,例如用户订单数据、用户购物车,需要携带 id_token。

id_token 是用户的身份标识,就像身份证一样。id_token 是一个 ,由三部分组成,aaa.bbb.ccc。其中 aaa 是元信息,bbb 是用户信息,ccc 是签名。aaa、bbb 都是 JSON 对象经过 编码后的字符。ccc 是签名二进制序列通过 base64 编码后的值。

JWT Token 的三部分

元信息:有一些属性,用于描述本 id_token JWT 的签名算法,负载(payload)部分的类型等。

负载(payload):里面会有一些属性,用于描述被认证者的身份和本 token 的信息,比如用户 id,颁发时间,接收方等。

签名:aaa 和 bbb 部分通过 . 连接,加上一个私钥进行摘要计算从而得到。如果 token 被篡改过,比如改变认证主体。那么服务器在本地计算的签名和 token 的 ccc 部分携带的签名就会不一致,从而拒绝请求。

你应该在服务器上实现一个数据保护中间件,对特定的数据接口启用,如果请求没有携带 id_token 或者签名校验失败就将用户重定向到登录页,如果 id_token 校验成功,就返回数据给用户。

什么时候需要授权?

你为其他人提供身份服务,其他应用需要从你的服务器获取用户信息。比如 Github 提供身份服务,其他应用可以向 Github 索要用户的信息,完成用户在他们平台的注册,即三方登录。

第三方登录的实质是,让用户同意其他应用访问他在你的服务器上的信息,然后你会生成一个 Access Token 给第三方,只要第三方拥有这个 token,他就能代表用户访问此人在你的服务器上的数据。

OIDC 流程

既然需要认证、授权,那么你的服务器、三方服务器、用户这三者如何通信呢?如何颁发 token?要遵守怎样的规范呢?OIDC 是一套认证授权的规范,应用广泛,轻量简单,基于 OAuth 2.0,既可以用于授权,也可以用于身份认证。

access_token 用于授权,id_token 用于认证。

授权码模式

授权码模式是最常用的 OIDC 流程。

  1. 三方应用发起授权请求(我需要访问这个用户在你的服务器上的数据!)

  2. 你的服务器询问用户是否同意授权,要求用户输入用户名和密码,并弹出对方请求获取的信息条目(好的,我先问问用户是否同意你获取这些信息)

  3. 返回一个授权码给三方应用前端(或后端)。(把这个授权码给你的后端,让他凭此来获取 token!)

  4. 三方应用后端携带这个授权码向你服务器的 token 颁发接口请求数据。(请给我一个 token,授权码是 xxx)

  5. 返回 id_token access_token。(好的,这是你的 token,可以携带 access_token 去用户信息接口获取数据)

接口

授权码

Access Token

ID Token

授权

颁发

X

X

Token

X

颁发

颁发

scope 不带 openid 的情况

可见最后没有返回 ID Token。

隐式模式

当发起授权请求时 query 参数 response_type=token 的时候,使用的是隐式模式。即使在 scope 中包含了 openid,ID Token 也不会被返回。隐式模式可以一次请求,立刻获取到 Access Token。

接口

授权码

Access Token

ID Token

授权

X

颁发

X

当发起授权请求时 query 参数 response_type=id_token 的时候,使用的是隐式模式。只返回 ID Token。

接口

授权码

Access Token

ID Token

授权

X

X

颁发

当发起授权请求时 query 参数 response_type=id_token token 的时候,使用的是隐式模式。同时返回 ID Token 和 Access Token。

接口

授权码

Access Token

ID Token

授权

X

颁发

颁发

可以看出,隐式模式最为简单直接,但是在安全性上不如授权码模式,因为可能会在前端暴露 Access Token。隐式模式要求回调地址必须为 https。

混合模式

混合模式的意思是,发起授权请求后,既返回授权码又返回 Access Token 或 ID Token。

当发起授权请求时 query 参数 response_type=code id_token 的时候,使用的是混合模式。

接口

授权码

Access Token

ID Token

授权

颁发

X

颁发

Token

X

颁发

颁发

当发起授权请求时 query 参数 response_type=code token 的时候,使用的是混合模式。如果 scope 中存在 openid,各类信息返回情况如下表:

接口

授权码

Access Token

ID Token

授权

颁发

颁发

X

Token

X

颁发

颁发

如果 scope 不包含 openid,各类信息返回情况如下表:

接口

授权码

Access Token

ID Token

授权

颁发

颁发

X

Token

X

颁发

颁发

当发起授权请求时 query 参数 response_type=code id_token token 的时候,使用的是混合模式。各类信息返回情况如下表:

接口

授权码

Access Token

ID Token

授权

颁发

颁发

颁发

Token

X

颁发

颁发

这个用法可以一次性获取全部内容。

参考资料

OIDC 的所有模式
JWT Token
base64
数据保护中间件