OAuth及授权码机制介绍

我的个人网站:
http://riun.xyz


简介

OAuth2.0 是授权机制,用来授权第三方应用,获取用户数据。

比如在某些博客网站下方的评论区,经常看到需要使用github登陆然后才能评论,这就使用了OAuth的授权机制。这里我们把博客网站叫做【第三方应用】,把github叫做【用户数据所有者】,把使用github登陆然后才能跳转到博客网站进行评论叫做【授权】。 用户想要在博客网站的评论区进行评论,那我首先得要知道你是谁才能让你评论吧,但是我又没有你的数据,而且我只是需要知道你是谁,显示你的信息就行了,所以我也不必单独再做一个用户登陆系统,那索性我就去别的地方拿你的信息咯,所以我就让你跳转到github的登陆页面,登陆后显示出请求授权该网站的按钮,如果你同意并点击了,那么博客网站就能从github中拿到你的用户信息数据,再跳转到博客页面,你就可以评论了。评论后显示的用户名啊,头像啊这些东西都是从github中拿到的。

引用阮一峰的OAuth教程中的一句话:简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。

令牌与密码的区别:

令牌密码
短期,自动失效长期,用户不修改就不变
可以被撤销,然后立即失效
有权限范围完整权限

由于令牌相当于短期的密码,在固定的时间、权限范围内可读(或写)数据,所以令牌也是不能泄露的。这也是为什么令牌生效时间设置的很短的原因。

授权方式

OAuth的目的就是颁发令牌,第三方网站通过令牌可以去用户数据所有者取数据。下面介绍下四种授权方式,即四种获取令牌的流程。

  • 授权码(authorization-code)
  • 隐藏式(implicit)
  • 密码式(password):
  • 客户端凭证(client credentials)

不管那种方式,都必须先到第三方网站备案,说明自己的身份。

下面只讲解授权码的方式。具体四种方式,请参考:阮一峰的博客

授权码的方式:

下面将博客网站作为A网站,github作为B网站。

A网站提供一个链接:

https://b.com/oauth/authorize?
  response_type=code&
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read
# response_type 要求返回授权码
# client_id 是实现向B网站备案时,B提供给A的唯一确定身份的码。必须显式给出
# redirect_uri B网站接收或拒绝后跳转的网址。必须显式给出
# scope 授权范围

用户点击后跳到B网站的登陆页面,并询问是否同意授权A网站获取信息。当用户同意或拒绝后就会跳到到redirect_uri=CALLBACK_URL里提供的url

如果同意授权,跳回时,会返回一个授权码:

https://a.com/callback?code=AUTHORIZATION_CODE
# code 授权码

然后A网站在后端收到请求后,就可以在后端向B网站请求令牌,

https://b.com/oauth/token?
 client_id=CLIENT_ID&
 client_secret=CLIENT_SECRET&
 grant_type=authorization_code&
 code=AUTHORIZATION_CODE&
 redirect_uri=CALLBACK_URL
# client_id 客户端ID,同上。必须显式给出
# client_secret 客户端密钥,和client_id获取方式一样,不过是保密的。必须显式给出
# grant_type=authorization_code 表示是授权码的方式获取令牌
# code 上一步获取的授权码。必须显式给出
# redirect_uri 获取令牌后,B网站向此地址发送令牌相关信息

B网站收到获取令牌的请求,检查参数正确后,就会颁发令牌:向 redirect_uri 的地址发送一段json数据

{    
  "access_token":"ACCESS_TOKEN",
  "token_type":"bearer",
  "expires_in":2592000,
  "refresh_token":"REFRESH_TOKEN",
  "scope":"read",
  "uid":100101,
  "info":{...}
}
    # access_token 就是令牌

A网站在后端拿到,就可以向B网站的API请求数据。 每个发到 API 的请求,都必须带有令牌。 具体做法是在请求的头信息,加上一个Authorization字段,存放令牌信息。

curl -H "Authorization: Bearer ACCESS_TOKEN" \
"https://api.b.com"
# ACCESS_TOKEN 就是令牌

图:在这里插入图片描述

来源:阮一峰的博客

demo

目的:利用OAuth授权完成第三方登陆,最终获取第三方储存的用户数据。

小demo: http://www.ruanyifeng.com/blog/2019/04/github-oauth.html

内容是,利用github登陆授权后获取用户信息进行展示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值