OAuth2.0规范简介
本文最后更新于:2023年3月19日 晚上
本文转自:https://blog.csdn.net/chenleiking/article/details/80412500
1、简介
一个简单的例子来说明 oauth 是什么:
现在很多网站在登录时可以选择使用第三方账号登陆,比如这样:
你可以选择一个现有的账号来登了,比如 GitHub。然后就会跳转到 GitHub 的登陆界面,要求你输入账号密码登陆 GitHub,像这样:
当你登陆 GitHub 之后,会提示你:之前的网站需要访问你的信息,需要为之授权,像这样:
一旦你同意授权之后,就可以自动跳转到博客,并且使用 GitHub 账号登陆博客。
这是一个典型的 OAuth 认证授权过程,在这个过程中,涉及到以下角色:
- 资源所有者:GitHub 账号所有者,也就是我
- 第三方应用:CSDN 博客服务
- 授权服务器:GitHub 服务
- 资源服务器:GitHub 服务,这里的授权服务器和资源服务器是同一个,但这并不是必须的
- 代理客户端:浏览器
整个认证授权过程中,你并没有向 CSDN 提供你的 GitHub 密码,而是在 GitHub 上为 CSDN 授予访问你在 GitHub 上的资源(Account、Public data)的访问权限。你可以在所有支持 GitHub 账号登陆的网站上使用 GitHub 授权登陆,而这些第三方网站也可以根据你的授权范围访问你在 GitHub 上的资源。如果某天你不希望这些第三方网站中的一些继续访问你在 GitHub 上的资源,你可以移除对应的授权,同时不会对其他第三方网站产生影响:
2、授权流程
OAuth2.0 定义了四种授权许可类型,分别是:授权码、隐式许可、资源所有者密码凭据和客户端凭据。这里仅介绍授权码类型。授权码类型是功能最完整、流程最严密的授权模式,简化流程如下:
- 用户通过浏览器访问互联网网站,比如 CSDN
- 在浏览器输入 CSDN 地址,打开登陆节点,准备通过 GitHub 账号登陆
- CSDN 给浏览器返回 GitHub 授权地址,授权地址参数范围:
- response_type:必选项,常量
code - client_id:必选项,客户端注册时参数的客户端唯一标识符
- redirect_uri:可选性,授权成功后的跳转地址
- scope:可选项,授权范围,授权服务器定义的字符串常量,多个值使用空格分隔
- state:推荐项,用于维护请求和回调之间的状态的不透明的值,可用于防止 CSRF 攻击
- response_type:必选项,常量
- 浏览器根据 CSDN 的响应内容,跳转到 GitHub 授权地址,完成:登陆、授权、返回
- 登陆:用户输入凭据登陆 GitHub
- 授权:通常包括资源范围、有效时限等(比如:访问 QQ 空间、发布状态等)
- 返回:在上一步的 redirect_uri 上最佳 code 和 state 参数后返回浏览器
- code:根据用户授权参数到授权码
- state:上一步的 state 原样返回
- 浏览器根据 GitHub 的响应内容,跳转到 CSDN 服务端,跳转地址中包括 code 和 state
- CSDN 服务端获取 URL 中的 code,然后 CSDN 服务端访问 GitHub 服务端,请求参数范围:
- grant_type:必选项,常量
authorization_code - code:必选项,GitHub 返回的 code
- redirect_uri:必选项,必须和之前的 redirect_uri 完全一致
- client_id:必选项,通常 CSDN 会和 GitHub 协商(注册),GitHub 给 CSDN 一个唯一标识符
- client_secret:可选项,GitHub 以此来验证 CSDN 的真实性
- grant_type:必选项,常量
- GitHub 服务端验证成功后响应 CSDN 服务端,响应内容包括:
- access_token:必选项,授权服务器颁发的访问令牌,CSDN 凭此访问资源
- token_type:必选项,指令牌类型,大小写敏感
- expires_in:推荐项,令牌有效期,单位:秒
- refresh_token:必选项,access_token 过期后从新获取新值时的凭据,access_token 的有效期可能比 expires_in 短
- CSDN 服务端使用 access_token 向资源服务器(这里还是 GitHub)发出资源访问请求
- 资源服务器验证 access_token 是否合法(过期、超范围访问等),响应请求
- CSDN 向浏览器响应资源访问成功(这里是使用 GitHub 账号登陆成功,有可能还会获得用户头像等公开信息)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!