type
status
date
slug
summary
tags
category
icon
password
OAuth 2.0 是行业标准的授权协议, 专注于客户端开发人员的简单性,同时为 Web 应用程序、桌面应用程序、移动电话和客厅设备提供特定的授权流程。
角色
- 资源拥有者: 能够许可受保护资源访问权限的实体
- 资源服务:存储受保护资源的服务器,接收和响应访问受保护资源的请求
- 客户端: 对受保护资源发起请求的应用程序
- 授权服务器:验证资源所有者和对客户端颁发访问令牌(包含具体权限及其时效等信息)的服务器,授权服务器可以和资源服务器同为一台服务器,也可以分离开。
协议流程
- 用户打开客户端,客户端要求用户授权
- 用户同意,客户端获得授权
- 客户端拿到授权,向认证服务器申请令牌
- 认证服务器对客户端进行认证,认证通过发放令牌
- 客户端使用令牌向资源服务器获取资源
- 资源服务器对令牌进行校验,通过则同意客户端获取被保护的资源
认证方式
在RFC6749文件中定义了四种标准的的获取令牌的授权方式,分别为:
- 授权码(authorization-code)
- 隐藏式(implicit)
- 密码式(password)
- 客户端凭证(client credentials)
授权码模式(Authorization Code)
授权码方式就是通过从授权服务器申请一个授权码,然后携带授权码去申请令牌,这种方式最为常见,也最安全的。
如上图流程所示是一个通过github账号登陆leetcode的场景,用户在leetcode界面选择github登陆后,页面跳转到github页面。
该页面会提示是否将一些信息授权给leetcode,用户同意后,github跳转回指定的
CALLBACK_URL并携带上AUTHORIZATION_CODEleetcode收到
AUTHORIZATION_CODE后再使用AUTHORIZATION_CODE去获取令牌最后leetcode拿token,在使用token获取到github信息后使用该信息在自己服务器上登陆。
隐藏式(Implicit Code)
和授权码不同的是,隐藏式不需要授权码请求这一步,而是直接将令牌最为参数放在URL的方式返回。
同样leetcode跳转到github
用户同意授权后,将令牌作为URL参数传给leetcode
密码式
该方式主要通过使用账号密码来申请令牌,请求如下
凭证式
该方法适用于接口或命令的形式请求令牌
代码实践
使用到的三方库是:
github.com/x/oauth2在github上创建一个Oauth 的App,得到
ClientID和ClientSecret,然后启动GO服务,页面访问http://localhost:8080/login。- 首先重定向到github的auth url
- 用户点击确认授权
- github跳转回到我们之前填写的callback url
- 拿到授权码,再向github申请令牌token
- 拿到token后携带token请求github的相关接口
总结
OAuth 2.0 规范定义了一个授权(delegation)协议,对于使用Web的应用程序和API在网络上传递授权决策非常有用。OAuth被用在各钟各样的应用程序中,包括提供用户认证的机制,但是还是明确的指出:
OAuth2.0是一个授权协议
参考
- 作者:Ryan Wu
- 链接:https://hexo.fridaylab.top/article/c97e6dbc-c1a2-401a-a6eb-e598d49d170a
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章