在上一篇文章《华为帐号服务学习笔记(一):什么是HMS,什么是华为帐号服务》中已经给大家整理了一下华为帐号服务的使用场景和优势,接下来我就将带大家进一步了解华为帐号服务涉及的一些基础知识、接入方法、效率提升工具等。大家有什么疑问也可以随时在评论区提。
要了解华为帐号服务,首先我们需要熟悉2个协议:Oauth2.0和OpenID Connect协议,因为华为帐号的登录方式就是基于这两个协议来的,不仅仅是华为帐号,微信及其他厂商的帐号也基本基于这两个协议。本文先介绍Oauth2.0。
一、 一个有趣的问题
在回答什么是OAuth2.0前,我先抛出一个问题:
我们知道用户可以通过帐号+密码的方式获取自己华为或者微信帐号的详细信息,如用户名、邮箱、手机号等,但第三方App,比如下面这款app狂野飙车,用户使用了华为帐号登录后,这款app就获得了用户的华为帐号信息,那么它是怎么获得这些信息的呢?
要回答上面这个问题,需要引入一个概念:代理授权;代理授权是一种允许第三方应用访问用户数据的方法。有两种方式:
1、用户的帐号密码提供给第三方应用,以便它们可以代表你来登陆帐号并且访问数据;
2、通过 OAuth 授权第三方应用访问用户的数据,而无需提供密码;
第一种方式相信没有用户会接受,没有哪个用户愿意把自己的用户名和密码暴露给其他人。第二种方式就使用到OAuth协议了,它不需要提供用户的密码给第三方,第三方也能获取到需要的数据,这也是为什么我们需要OAuth的原因。
二、究竟什么是OAuth2.0?
OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。有了OAuth2.0以后,之前的问题就能这样解决:用户对第三方应用进行有限授权,第三方应用通过这个有限授权就能到对应帐号服务器去获取授权过的信息。
OAuth2.0的设计思想:
之前看到过这样一个比喻,我觉得能非常形象的说明OAuth2.0的设计思想,现在就拿过来用一下,方便大家快速理解。
快递员与小区门禁系统:
1、每个小区都有门禁系统,输入密码可进入小区,只有业主知道密码
2、快递员经常进入小区送快递,快递员有几种方式进入小区:
A、业主告诉快递员门禁密码,快递员通过输入密码进入
B、业主远程为快递员开门
C、为快递员开辟一条新通道,只用于送快递到指定地点:
——》在门禁系统中增加“请求授权”按键
——》快递员按下按钮请求业主授权进入
——》业主同意授权后给快递员返回一个“有限密码”
——》快递员通过输入这个密码,可以进入到小区投递快递的地点,但不能进入其他地方。
前两种方式都不是最优的,首先小区密码拥有很多权限,给快递员非常不安全;其次,小区可能有很多门,快递员每通过一个门业主就需要远程为他开一次门也很烦;第C种方式是最优的,它的设计思想用于互联网就是OAuth2.0了。
OAuth2.0协议的相关术语
资源所有者(Resource Owner):拥有客户端应用程序想要访问的数据的用户。
客户端(Client):想要访问用户数据的的应用程序
授权服务端(Authorization Server):通过用户许可,授权客户端访问用户数据的授权服务端。
资源服务端(Resource Server):存储客户端要访问的数据的系统。在某些情况下,资源服务端和授权服务端是同一个服务端。
访问令牌(Access Token):访问令牌是客户端可用于访问资源服务端上用户授权的数据的唯一密钥。
Scope:授权范围,用于限制应用程序访问用户的哪些数据
OAuth2.0协议的基本流程
Access Token与密码的异同:
1、Access Token与密码一样,是获取用户数据的凭证,泄漏AT与泄漏密码后果一样
2、Access Token是短期的,到期自动失效,用户无法修改;密码一般是长期有效,不修改不会变化
3、Access Token可以被数据所有者撤销,撤销后会立即生效,而密码一般不允许被人撤销
4、Access Token有权限范围即Scope,可以指定持有人只能做什么事情,而持有密码的人拥有的是完整权限,可以做所有的事情
Access Token的设计可以让第三方应用获得相应权限,又随时可控,不会危及系统安全。
OAuth 2.0的四种方式
这里主要介绍第一种。
1、授权码(authorization-code)
指客户端先获取一个授权码(Code),再用授权码换取Access Token;
使用场景:客户端有自己的后台服务器
特点:授权码通过前端传递,而AT存储在后台服务器,通过后台服务器与资源和授权服务器完成交互,前后端分离,非常安全
2、隐藏式
使用场景:纯前端应用,没有后台服务器
特点:没有授权码,直接给前端颁发AT,AT存储在前端,不是很安全,适用于安全要求不高的场景
3、密码式
使用场景:高度信任某应用,并且无法采用其他授权方式的情况
特点:用户直接将用户名和密码告诉第三方应用,第三方应用使用你的密码去申请令牌
4、凭证式
使用场景:没有前端的命令行应用
特点:在命令行下请求令牌,直接信任第三方
Access Token过期问题
AT是有期限的,AT过期后就需要重新获取。
两种方式:
1、按照之前的流程重新获取一遍AT,这种体验不好;
2、OAuth2.0给出的方式是:在返回Access Token的同时返回一个Refresh Token,当AT(Access Token)过期以后,可以用RT(Refresh Token)去重新获取AT。
以上就是我要分享的OAuth2.0内容,希望能给大家的理解带来益处。接下来我还会分享OpenID Connect协议内容。希望大家持续关注本帐号。
后续笔者会不断输出相关领域的优质内容,希望大家持续关注本帐号!