type
status
date
slug
summary
tags
category
icon
password
OAuth 2.0 是行业标准的授权协议, 专注于客户端开发人员的简单性,同时为 Web 应用程序、桌面应用程序、移动电话和客厅设备提供特定的授权流程。

角色

  • 资源拥有者: 能够许可受保护资源访问权限的实体
  • 资源服务:存储受保护资源的服务器,接收和响应访问受保护资源的请求
  • 客户端: 对受保护资源发起请求的应用程序
  • 授权服务器:验证资源所有者和对客户端颁发访问令牌(包含具体权限及其时效等信息)的服务器,授权服务器可以和资源服务器同为一台服务器,也可以分离开。

协议流程

  1. 用户打开客户端,客户端要求用户授权
  1. 用户同意,客户端获得授权
  1. 客户端拿到授权,向认证服务器申请令牌
  1. 认证服务器对客户端进行认证,认证通过发放令牌
  1. 客户端使用令牌向资源服务器获取资源
  1. 资源服务器对令牌进行校验,通过则同意客户端获取被保护的资源

认证方式

RFC6749文件中定义了四种标准的的获取令牌的授权方式,分别为:
  • 授权码(authorization-code)
  • 隐藏式(implicit)
  • 密码式(password)
  • 客户端凭证(client credentials)

授权码模式(Authorization Code)

授权码方式就是通过从授权服务器申请一个授权码,然后携带授权码去申请令牌,这种方式最为常见,也最安全的。
如上图流程所示是一个通过github账号登陆leetcode的场景,用户在leetcode界面选择github登陆后,页面跳转到github页面。
该页面会提示是否将一些信息授权给leetcode,用户同意后,github跳转回指定的CALLBACK_URL并携带上AUTHORIZATION_CODE
leetcode收到AUTHORIZATION_CODE后再使用AUTHORIZATION_CODE去获取令牌
最后leetcode拿token,在使用token获取到github信息后使用该信息在自己服务器上登陆。

隐藏式(Implicit Code)

和授权码不同的是,隐藏式不需要授权码请求这一步,而是直接将令牌最为参数放在URL的方式返回。
同样leetcode跳转到github
用户同意授权后,将令牌作为URL参数传给leetcode

密码式

该方式主要通过使用账号密码来申请令牌,请求如下

凭证式

该方法适用于接口或命令的形式请求令牌

代码实践

使用到的三方库是:github.com/x/oauth2
在github上创建一个Oauth 的App,得到ClientIDClientSecret,然后启动GO服务,页面访问http://localhost:8080/login。
  1. 首先重定向到github的auth url
  1. 用户点击确认授权
  1. github跳转回到我们之前填写的callback url
  1. 拿到授权码,再向github申请令牌token
  1. 拿到token后携带token请求github的相关接口

总结

OAuth 2.0 规范定义了一个授权(delegation)协议,对于使用Web的应用程序和API在网络上传递授权决策非常有用。OAuth被用在各钟各样的应用程序中,包括提供用户认证的机制,但是还是明确的指出:
OAuth2.0是一个授权协议

参考

初识Kerberos协议DNS隧道攻击和防护
  • Twikoo