OAuth授权

OAuth概念

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用,下面以github 为例,简单讲述OAuth2.0

应用场景

假如你访问我的网站,看到上面有篇文章写的很烂,你想去喷它一下,留言后发现需要登陆才能进行评论,此时给你两个选择:1. 注册并登陆后进行评论 2. 使用github登陆授权后评论。由于你实在不爽,迫不及待想喷它,注册登陆太烦了,可能还有邮箱,手机等验证。于是直接点击了github授权,此时OAuth认证流程就开始了。需要注意的是,即便刚刚用户才登陆过github,我的网站也不可能随便发个请求给github,就能拿到用户信息。因此,我的网站需要和github需要一个协商。## 认证流程

1.网站和github协商

github会对用户的权限做分类,读取仓库信息的权限(CircleCi,Travis-Ci的集成测试)、写入仓库的权限,用户个人常用信息获取等。我如果我的这个应用需要获取用户的follower等信息,我先得去github注册一个应用,在申请的时候需要选择需要获得的权限。首先注册一个github的OAuth应用,填写应用名称,以及重定向地址(不能乱填)。


注册应用

授权id,secret,以及callback_url

注册完成后,github给我发了一个client_id以及另外一个client_secret.

2.用户和github协商

用户进入我的网站,点击 github 登录按钮的时候,我的网站会把上面拿到的 client_id 交给用户,让他进入到 github 的授权页面,github看到client_id,就知道是从哪个应用重定向过来的,于是它会把想要获取的权限列出来,让用户选择是否允许授权这些权限。如果用户拒绝,整个认证结束。如果用户觉得可以,选择授权,页面后跳转到上面注册的redirect_url,并且附带一个一次性的code。这个时候,用户和 github 之间的协商就已经完成github 也会在自己的系统中记录这次协商,表示该用户已经允许在我的网站访问上直接操作和使用他的部分资源。


登陆认证
授权对应权限

服务端可以指定相应的scope参数,给用户授权


授权scope为repo和user

登陆后,客户可以拿到相应的code

获得code

但是由于没有这个路由,页面会显示404,所以需要服务端重定向到首页。拿到了code,接下来就可以去拿取access-token了。### 3.应用拿用户的票据去github获取相应的数据

3.应用拿用户的票据去github获取相应的数据

在第2步的时候,已经拿到了用户的code,但是如果服务器直接拿code去github请求,肯定会遭到拒绝,因为任何人都知道code,你还不能证明是你本人访问。接下来需要使用client_secret.拿着授权获取的code,以及client_id以及client_secret去请求github,获取access_token.


获取token

4.用户使用github账户,在我的应用上使用

上一步 github 已经把最后的凭证 access_token 给我了,通过 github 提供的 API 加access_token就能够访问用户的信息了,能获取用户的哪些权限在 response 中也给了明确的说明,scope 为 user 和 gist,也就是只能获取 user 组和 gist 组两个小组的权限,user 组中就包含了用户的名字和邮箱等信息了。


通过token获取个人信息

关键参数

1. client_id 注册时获取,用于获取code和access_token
2. client_secret 注册时获取,用于获取access_token
3. code 用户登陆后,OAuth提供方返回的code,表示,用户同意使用该OAuth认证方式,登陆应用。
4. redirect_url 注册时填写的重定向路径, 如果在服务端手动改写和redirect_url不同的地址,则无法重定向成功, OAuth方会返回重定向错误的提示.
5.scope 用于配置权限,一般有user, repo

code如何保证安全

1.code是一次性的,再次使用这个code去请求,则失败
再次使用code会失败
2.使用的client_id,client_secret永久保存在服务器上的,只要服务器是安全的,即便有人中间试图截取code,也是无效的,请求token需要发送client_id,client_secret以及code
3.redirect_url 如果重定向的地址和向OAuth提供商注册的地址不同,则不会返回code。如果地址注册的是localhost,有可能窃取code,但是 也只有能访问该电脑的人能获取权限。## 和OpenId的区别
OpenId 只用于身份认证(Authentication),允许你以同一个账户在多个网站登陆。它仅仅是为你的合法身份背书,当你以 Facebook 账号登陆某个站点之后,该站点无权访问你的在 Facebook 上的数据。但是OAuth授权登陆后,可能该网站就可以访问你的Facebook账号的followers,你关注的人之类的数据。

你可能感兴趣的:(OAuth授权)