OAuth概念
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用,下面以github 为例,简单讲述OAuth2.0
应用场景
假如你访问我的网站,看到上面有篇文章写的很烂,你想去喷它一下,留言后发现需要登陆才能进行评论,此时给你两个选择:1. 注册并登陆后进行评论 2. 使用github登陆授权后评论。由于你实在不爽,迫不及待想喷它,注册登陆太烦了,可能还有邮箱,手机等验证。于是直接点击了github授权,此时OAuth认证流程就开始了。需要注意的是,即便刚刚用户才登陆过github,我的网站也不可能随便发个请求给github,就能拿到用户信息。因此,我的网站需要和github需要一个协商。## 认证流程
1.网站和github协商
github会对用户的权限做分类,读取仓库信息的权限(CircleCi,Travis-Ci的集成测试)、写入仓库的权限,用户个人常用信息获取等。我如果我的这个应用需要获取用户的follower等信息,我先得去github注册一个应用,在申请的时候需要选择需要获得的权限。首先注册一个github的OAuth应用,填写应用名称,以及重定向地址(不能乱填)。
注册完成后,github给我发了一个client_id以及另外一个client_secret.
2.用户和github协商
用户进入我的网站,点击 github 登录按钮的时候,我的网站会把上面拿到的 client_id 交给用户,让他进入到 github 的授权页面,github看到client_id,就知道是从哪个应用重定向过来的,于是它会把想要获取的权限列出来,让用户选择是否允许授权这些权限。如果用户拒绝,整个认证结束。如果用户觉得可以,选择授权,页面后跳转到上面注册的redirect_url,并且附带一个一次性的code。这个时候,用户和 github 之间的协商就已经完成github 也会在自己的系统中记录这次协商,表示该用户已经允许在我的网站访问上直接操作和使用他的部分资源。
服务端可以指定相应的scope参数,给用户授权
登陆后,客户可以拿到相应的code
但是由于没有这个路由,页面会显示404,所以需要服务端重定向到首页。拿到了code,接下来就可以去拿取access-token了。### 3.应用拿用户的票据去github获取相应的数据
3.应用拿用户的票据去github获取相应的数据
在第2步的时候,已经拿到了用户的code,但是如果服务器直接拿code去github请求,肯定会遭到拒绝,因为任何人都知道code,你还不能证明是你本人访问。接下来需要使用client_secret.拿着授权获取的code,以及client_id以及client_secret去请求github,获取access_token.
4.用户使用github账户,在我的应用上使用
上一步 github 已经把最后的凭证 access_token 给我了,通过 github 提供的 API 加access_token就能够访问用户的信息了,能获取用户的哪些权限在 response 中也给了明确的说明,scope 为 user 和 gist,也就是只能获取 user 组和 gist 组两个小组的权限,user 组中就包含了用户的名字和邮箱等信息了。