概述
# OIDC简介
OIDC(OpenID Connect)是在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。它使客户端能够基于授权服务器的验证来验证最终用户的身份。OAuth2.0提供了授权,即基于权限验证是否有权访问某些内容的过程。OIDC提供身份验证,即验证身份的过程。
OAuth2使用access token来授权三方应用访问受保护的信息。OIDC遵循OAuth2协议流程,并在这个基础上提供了id token来解决三方应用的用户身份认证问题。 OIDC将用户身份认证信息以id token的方式给到三方应用。 id token基于**JWT(json web token)**进行封装,具有自包含性、紧凑性和防篡改性等特点。三方应用在验证完id token的正确性后,可以进一步通过OAuth2授权流程获得的access token读取更多的用户信息。 了解id token的话,我们先看看JWT是什么?
# JWT 简介
# 什么是JWT
JSON Web Token(JWT)是一个开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地将信息作为JSON对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用密钥(使用HMAC算法)或使用RSA或ECDSA的公用/专用密钥对对JWT进行签名和加密。
数字签名的JWT可以保证id_token的不可否认性,认证和完整性,但是并不能保证其机密性,所以id_token中不建议不要包含有机密性要求的敏感的数据。
# JWT结构是什么
JSON Web Token以紧凑的形式由三部分组成,这些部分由点(.)分隔,分别是:Header.Payload.Signature
# 什么是ID Token
ID Token是一个安全令牌,是一个包含特定声明(Claim)的jwt,特定的声明指的是身份验证服务器验证终端用户时候产生的供客户端使用的信息,如发行人(issuer)、最终用户标识(sub)、客户端id(aud)、过期时间(exp)、Token的发布时间(iat)等,另外也可以包含其它的声明。ID Token由身份验证服务器(OP)颁发,交由客户端(RP)进行验证。看起来像这样:
# ID Token的主要构成
ID Token主要包含如下必须Claim,还可以根据应用映射配置添加自定义claim
iss = Issuer Identifier:必须。提供认证信息者的唯一标识。固定为:https://{your_domain}/api/v1/oauth2。
jti = JWT ID:必须。令牌的唯一标识符,可用于防止重复使用令牌。
sub = Subject Identifier:必须。应用的账号名。iss提供的EU的标识,在iss范围内唯一。它会被RP用来标识唯一的用户。最长为255个ASCII个字符
aud = Audience(s):必须。标识ID Token的受众。申请接入后分配给第三方应用的clientid。
exp = Expiration time:必须。过期时间,超过此时间的ID Token会作废不再被验证通过。
iat = Issued At Time:必须。JWT的构建的时间。
nbf = Not Before:必须。JWT的生成最初时间,在此之前的时间的ID Token不被验证通过。
# 术语说明
竹云IDaaS统一认证中心:即授权服务器,下文简称竹云IDaaS。
用户中心:竹云IDaaS为企业用户提供集中访问第三方应用的门户系统。
EU:End User:一个人类用户。
RP:Relying Party,用来代指OIDC中的受信任的客户端,身份认证和授权信息的消费方。
OP:OpenID Provider,有能力提供EU认证的服务(比如OIDC中的授权服务),用来为RP提供EU的身份认证信息。
UserInfo Endpoint:用户信息接口(受OIDC保护),当RP使用Access Token访问时,返回授权用户的信息,此接口必须使用HTTPS。
ID Token:JWT格式的数据,包含EU身份认证的信息。