笔者在《华为帐号服务学习笔记(二):OAuth2.0 协议详解》《华为帐号服务学习笔记(三):10 分钟完成Authorization Code 模式客户端Demo 开发》《华为帐号服务学习笔记(四):Authorization Code 模式服务端Demo 开发》三篇文章中已经给大家详细介绍了Auth2.0 协议,以及华为帐号服务基于该协议开发的Authorization Code 授权模式客户端、服务端开发指导,这种模式是华为官方推荐的模式,有服务器的最好使用这种模式。华为还支持另外一种模式叫ID-Token 模式,这种模式既可以用于有服务器场景也可以用于无服务器场景,有人会问既然这种模式两种场景都能用,为啥不推荐这种模式呢?这就要从这种模式使用的协议说起了,下面就来解答这个问题。
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 )等。
因OAuth2.0 四种授权模式中密码式和凭证式直接信任第三方,不需要在进行附加认证, OpenId Connect 协议主要提供了授权码模式和隐含模式。
授权码模式: 必须有后台服务器

在有应用服务器的情况下,客户端将ID Token 发送给应用服务端,应用服务器对ID Token 进行校验,并从ID Token 中解析出用户的帐号信息。
隐含模式: 即 OpenID Connect 默认模式,适用于纯前端应用

这种模式因为没有服务端,直接在客户端进行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 不会过期,这样就不用再需要用户去走一遍授权流程了,所以体验上会更优。。
** 后续笔者会不断输出相关领域的优质内容,希望大家持续关注本帐号!**
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69997171/viewspace-2769586/ ,如需转载,请注明出处,否则将追究法律责任。