笔者在《华为帐号服务学习笔记(二):OAuth2.0协议详解》《华为帐号服务学习笔记(三):10分钟完成Authorization Code模式客户端Demo开发》《华为帐号服务学习笔记(四):Authorization Code模式服务端Demo开发》三篇文章中已经给大家详细介绍了Auth2.0协议,以及华为帐号服务基于该协议开发的Authorization Code授权模式客户端、服务端开发指导,这种模式是华为官方推荐的模式,有服务器的最好使用这种模式。华为还支持另外一种模式叫ID-Token模式,这种模式既可以用于有服务器场景也可以用于无服务器场景,有人会问既然这种模式两种场景都能用,为啥不推荐这种模式呢?这就要从这种模式使用的协议说起了,下面就来解答这个问题。
什么是OpenID Connect协议
OpenID Connect协议是基于OAuth2.0实现的用户认证规范,对OAuth2.0接口进行了扩展,通过在协议中扩展身份认证所需的ID Token字段,向第三方应用提供身份认证服务。OpenID Connect是“认证”和“授权”的结合。
也就是说OpenID Connect协议就是在Auth2.0协议的基础上增加了一个ID Token字段,用于身份认证。Auth2.0协议规定用户授权后能获取到一个Code,而OpenID Connect协议获取到的就是个ID Token了。那什么是ID Token呢?
ID Token也是一个JWT,或者又称 JSON Web Token,JWT 是一个编码令牌,它由三部分组成:头部,有效负载和签名。在获得了 ID 令牌后,客户端可以将其解码,并且得到被编码在有效负载中的用户信息,如:
{
“iss”: “https://accounts.huawei.com”,
“sub”: “10965150351106250715113082368”,
“email”: “hexianbin@example.com”,
“iat”: 1516239022,
“exp”: 1516242922
}
其中:
• iss:是令牌发布者
• sub:是用户的唯一标识符
• email:是用户的邮箱
• iat:用 Unix 时间表示的令牌发布时间
• exp:Unix 时间表示的令牌到期时间
当然,还可以通过Scope指定ID-Token中是否包括个人主页(profile)、邮箱(email)、地址(address)和电话(phone)等。
OpenID Connect认证流程
因OAuth2.0 四种授权模式中密码式和凭证式直接信任第三方,不需要在进行附加认证, OpenId Connect协议主要提供了授权码模式和隐含模式。
授权码模式:必须有后台服务器
在有应用服务器的情况下,客户端将ID Token发送给应用服务端,应用服务器对ID Token进行校验,并从ID Token中解析出用户的帐号信息。
隐含模式:即OpenID Connect默认模式,适用于纯前端应用
这种模式因为没有服务端,直接在客户端进行ID Token的校验和解析。
如何校验和解析ID Token?
1、使用通用JWT库(如jwt.io)对 ID-Token进行解码;
2、对ID-Token进行签名校验(验证数据完整性)
3、验证iss字段是否是对应的令牌发布者
如华为帐号服务的iss为:https://accounts.huawei.com,那我们就需要验证iss字段是不是等于https://accounts.huawei.com。
4、验证aud字段的值是否等于app id
5、验证ID Token是否过期
6、验证完成后,再解析出用户信息,用户信息包括:用户昵称、头像、邮箱等。
了解了以上内容之后,我们就来回答一下开始的这个问题,为什么code模式比ID Token模式更好呢?笔者觉得主要原因是ID Token模式即使在有服务器的场景下,当ID Token过期后,需要用户重新走一遍授权流程;而Code模式是可以在服务器端进行AT保活的,保证AT不会过期,这样就不用再需要用户去走一遍授权流程了,所以体验上会更优。。
**后续笔者会不断输出相关领域的优质内容,希望大家持续关注本帐号!**