笔者在《华为帐号服务学习笔记(二):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 TokenJWT 是一个编码令牌,它由三部分组成:头部,有效负载和签名。在获得了 ID 令牌后,客户端可以将其解码,并且得到被编码在有效负载中的用户信息,如:

         {

   iss: https://accounts.huawei.com,

   sub: 10965150351106250715113082368,

   email: hexianbin@example.com,

   iat: 1516239022,

   exp: 1516242922

}

其中:

       iss:是令牌发布者

       sub:是用户的唯一标识符

       email:是用户的邮箱

       iat:用 Unix 时间表示的令牌发布时间

       expUnix 时间表示的令牌到期时间

当然,还可以通过Scope指定ID-Token中是否包括个人主页(profile)、邮箱(email)、地址(address)和电话(phone)等。

OpenID Connect认证流程

OAuth2.0 四种授权模式中密码式和凭证式直接信任第三方,不需要在进行附加认证, OpenId Connect协议主要提供了授权码模式和隐含模式。

授权码模式:必须有后台服务器

华为帐号服务学习笔记(五):OpenID Connect协议详解_ID Token

在有应用服务器的情况下,客户端将ID Token发送给应用服务端,应用服务器对ID Token进行校验,并从ID Token中解析出用户的帐号信息。

隐含模式:OpenID Connect默认模式,适用于纯前端应用

华为帐号服务学习笔记(五):OpenID Connect协议详解_OpenID Connect_02

这种模式因为没有服务端,直接在客户端进行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不会过期,这样就不用再需要用户去走一遍授权流程了,所以体验上会更优。。

 

**后续笔者会不断输出相关领域的优质内容,希望大家持续关注本帐号!**