华为帐号服务学习笔记(二):OAuth2.0 协议详解
在上一篇文章《华为帐号服务学习笔记(一):什么是 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 协议内容。希望大家持续关注本帐号。
后续笔者会不断输出相关领域的优质内容,希望大家持续关注本帐号!
版权声明: 本文为 InfoQ 作者【Coding狙击】的原创文章。
原文链接:【http://xie.infoq.cn/article/829ce0aee0c04b354ac377543】。文章转载请联系作者。
评论