梳理一下关于认证和授权的一些知识

本文全面讲解认证和授权的概念及其区别,包括身份与资源分离的意义。对LDAP协议进行深入介绍,包括其树状结构、基本模型和适用场景;详细分析OAuth2.0授权标准的四种授权模式及主体角色;并简述OIDC协议如何作为OAuth2.0的超集实现用户认证与资源授权的统一。适合开发者理解现代身份验证系统的基础架构。

什么是认证和授权

  • 认证(Authentication),识别身份

  • 授权(Authorization),授予被识别的身份是否有权限获取指定资源,或授予其操作权限

认证的双方是访问者(User)、身份信息持有者(IdP/Identity Provider)。

用户持有的唯一标识符(用户名,UUID 等),密码信息(密码,指纹等)需要与 IdP 持有的信息匹配才能认证成功。

资源持有者(Source Owner),控制资源的获取,修改,删除等。

  • 身份和资源的分离

资源可能是用户自己产生的,也可能是第三方服务器产生的,或者叫做 Service Provider(SP),也称 Client。

身份和资源的分离即为 IdP, SP 分离

IdP 与 IdP 之前也可以进行资源传递,并授权。这种方式一般称为 联邦授权


LDAP

LDAP(Light Directory Access Protocol)即轻量级目录访问协议,它是一种为 查询浏览搜索 而优化的专业分布式数据库,它呈树状结构组织数据,和 关系数据库 不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据,所以大多数是用来查询的。LDAP 只是一种协议,可以有多种实现。

一般结构:

DIT(Directory Information Tree)目录信息树
dn(Distinguished Name):一条记录的详细位置,相当于绝对路径(唯一)
rdn(Relative dn) : 相对 dn, 相对于相对路径
dc(Domain Component) :一条记录所属区域 (哪一颗树)
ou(Organization Unit) :一条记录所属组织 (哪一个分支)
cn/uid(Common Name/user id):一条记录的名字/ID (哪一个苹果名字)
sn(Surname): 名字前缀(姓)

基本模型:

  • 信息模型,将信息以树状方式组织,基本数据单元是条目(Entry), 条目又由不同属性组成

  • 命名模型,实现一种条目定位方式

  • 功能模型,实现增删改查等功能

  • 安全模型,实现身份认证,安全通道,访问控制


OAuth2.0

OAuth 2.0 是一个授权标准协议,主要用于 资源授权

前面提到的身份和资源的分离,OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。资源所有者同意以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。

所以,OAuth 的核心就是向第三方应用颁发令牌

根据 OAuth 2.0 协议规范,主要有四个主体:

  • 授权服务器(Authorization Server),负责颁发 Access Token,Authing 是授权服务器。

  • 资源所有者(Resource Owner),即 用户,授权其他人访问他的资源。

  • 调用方(Client),即第三方应用。调用方请求获取 Access Token,经过用户授权后,授权服务器为其颁发 Access Token。调用方可以携带 Access Token 到资源服务器访问用户的资源。

  • 资源服务器(Resouce Server),存储用户资源。收到 Access Token 后,验证它的被赋予的权限项目,最后返回资源。

这个过程可能还存在其它主体,如浏览器,也称用户代理(User Agent), 服务提供商(Server Provider)等。

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0 定义了四种授权方式。

  • 授权码模式(authorization code)

  • 简化模式(implicit)

  • 密码模式(resource owner password credentials)

  • 客户端模式(client credentials)

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与 “服务提供商” 的认证服务器进行互动。

它的步骤如下:

(A)用户访问客户端,后者将前者导向认证服务器。

(B)用户选择是否给予客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的 “重定向 URI”(redirection URI),同时附上一个授权码。

(D)客户端收到授权码,附上早先的 “重定向 URI”,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E)认证服务器核对了授权码和重定向 URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。


OIDC

OIDC(OpenID Connect ) 是 OAuth 2.0 协议的超集,能够认证用户并完成资源授权。OIDC 的认证和授权分为 四种模式:授权码模式(Code)、隐式模式(Implicit)、密码模式(Password)、客户端证书模式(Client Credential)

除了 OIDC 协议之外,还存在着许多标准身份协议,例如 SAML 和 CAS。它们的存在意义都是类似的:为了能让素不相识的 SP 和 IdP 进行快速对接,在用户的许可下让 SP 在 IdP 处完成授权,从而访问 IdP 下资源提供者的资源。

参考链接