返回介绍

3.3.1 OAuth

发布于 2024-10-03 16:34:02 字数 4234 浏览 0 评论 0 收藏 0

OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 OAuth 的授权不会使第三方触及到用户的帐号 信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 OAuth 是安全的。oAuth 是 Open Authorization 的简写。

表格 5 oAuth 版本史

版本简介说明
OAuth 1.0OAuth Core 1.0 版本发布于 2007 年 12 月 4 日,由于存在可被会话定向攻击(session fixation attack) 的缘故,2009 年 6 月 24 日发布了 OAuth Core 1.0 Revision A 版本。最终在 2010 年 4 月,OAuth 成为了 RFC 标准: RFC 5849: The OAuth 1.0 Protocol。OAuth 的标准版本涉及三步流程,分别要访问三个 URL。
OAuth 2.02010 年 5 月初在 IETF 发布草案。OAuth 2.0 是 OAuth 协议的下一版本,但不 向后兼容 OAuth1.0。 OAuth 2.0 关注客户端开发者的简易性,同时为 Web 应用,桌面应用和手机,和起居室设备提供专门的认证流程。OAuth 2.0 简化开发,流程中去除涉及用户授权的环节。

备注:3-Legged OAuth 就是通过 User 的授权,Consumer 可以访问 User 在 Service Provider 的数据;至于 2-Legged OAuth,没有 User 的参与,只是 Consumer 和 Service Provider 的交互。

一个典型的 OAuth 应用通常包括三种角色,分别是:

  • Consumer:消费方
  • Service Provider:服务提供者
  • User:用户

消费方如果想使用服务提供者的 OAuth 功能,通常需要先申请两样东西:

  • Consumer Key
  • Consumer Secret

OAuth 1.0

OAuth 认证授权就三个步骤:

  1. 获取未授权的 Request Token。
  2. 获取用户授权的 Request Token。
  3. 用授权的 Request Token 换取 Access Token

上面三步分别对应于三个 URL:Request Token URL、User Authorization URL 和 Access Token URL。

image-20200108003001319

图 3 OAuth 流程

说明:

  • A:消费方请求 Request Token
  • B:服务提供者授权 Request Token
  • C:消费方定向用户到服务提供者
  • D:获得用户授权后,服务提供者定向用户到消费方
  • E:消费方请求 Access Token
  • F:服务提供者授权 Access Token
  • G:消费方访问受保护的资源

OAuth 2.0

OAuth 2.0 定义了四种授权方式。

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

备注:在 API 市场的 API 授权管理使用中, 消费者 key 常指 appid,消费者 secret 指静态 token。通过静态 token 获取动态 token,动态 token 验证是否过期、是否已授权(若未授权需要在 API 市场订阅,订阅过程会获取提供方的授权 token)。

示例:twitter/google/azure

https://raw.githubusercontent.com/dpgaspar/Flask-AppBuilder/master/examples/oauth/config.py

OAUTH_PROVIDERS = [
  {'name':'twitter', 'icon':'fa-twitter',
    'remote_app': {
      'consumer_key': os.environ.get('TWITTER_KEY'),
      'consumer_secret': os.environ.get('TWITTER_SECRET'),
      'base_url': 'https://api.twitter.com/1.1/',
      'request_token_url': 'https://api.twitter.com/oauth/request_token',
      'access_token_url': 'https://api.twitter.com/oauth/access_token',
      'authorize_url': 'https://api.twitter.com/oauth/authenticate'}
  },
  {'name': 'google', 'icon': 'fa-google', 'token_key': 'access_token',
    'remote_app': {
      'consumer_key': os.environ.get('GOOGLE_KEY'),
      'consumer_secret': os.environ.get('GOOGLE_SECRET'),
      'base_url': 'https://www.googleapis.com/oauth2/v2/',
      'request_token_params': {
       'scope': 'email profile'
      },
      'request_token_url': None,
      'access_token_url': 'https://accounts.google.com/o/oauth2/token',
      'authorize_url': 'https://accounts.google.com/o/oauth2/auth'}
  },
  {'name': 'azure', 'icon': 'fa-windows', 'token_key': 'access_token',
    'remote_app': {
      'consumer_key': os.environ.get('AZURE_APPLICATION_ID'),
      'consumer_secret': os.environ.get('AZURE_SECRET'),
      'base_url': 'https://login.microsoftonline.com/{AZURE_TENANT_ID}/oauth2',
      'request_token_params': {
       'scope': 'User.read name preferred_username email profile',
       'resource' : os.environ.get('AZURE_APPLICATION_ID'),
      },
      'request_token_url': None,
           'access_token_url':'https://login.microsoftonline.com/{AZURE_TENANT_ID}/oauth2/token',
  'authorize_url':'https://login.microsoftonline.com/{AZURE_TENANT_ID}/oauth2/authorize'}
  }
]
# OAuth 2.0 去除了用户鉴权步骤,即 request_token_url=None

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文