Auth2.0原理

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。目前Auth2.0已经得到了广泛应用,比如微信登录、微博、QQ等。

一、为什么要使用OAuth
为了理解OAuth的适用场合,让我举一个假设的例子。
有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"读取自己储存在Google上的照片。
问题是只有得到用户的授权,Google才会同意"云冲印"读取这些照片。那么,"云冲印"怎样获得用户的授权呢?
传统方法是,用户将自己的Google用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。
(1)"云冲印"为了后续的服务,会保存用户的密码,这样很不安全。
(2)Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。
(3)"云冲印"拥有了获取用户储存在Google所有资料的权力,用户没法限制"云冲印"获得授权的范围和有效期。
(4)用户只有修改密码,才能收回赋予"云冲印"的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
(5)只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。

OAuth就是为了解决上面这些问题而诞生的。

二、OAuth2.0授权流程
关于OAuth2.0协议的授权流程可以参考下面的流程图

其中Client指第三方应用,Resource Owner指用户,Authorization Server是我们的授权服务器,Resource Server是API服务器。

解释一下上述流程:

(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。

三、授权模式
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。
授权码模式(authorization code)
简化模式(implicit)
密码模式(resource owner password credentials)
客户端模式(client credentials)

四、授权码模式
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。

它的步骤如下:
(A)用户访问客户端,后者将前者导向认证服务器。
(B)用户选择是否给予客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。


下面是上面这些步骤所需要的参数。
A步骤中,客户端申请认证的URI,包含以下参数:
response_type&#

### OAuth 2.0 工作原理与实现机制 #### 授权框架概述 OAuth 2.0 是一种授权协议,旨在允许第三方应用程序在不暴露用户凭证的情况下获取用户的资源访问权限。其核心目标是通过引入 **授权服务器** 和 **令牌机制** 来增强安全性并简化开发过程[^1]。 #### 主要角色定义 OAuth 2.0 中涉及四个主要角色: - **资源拥有者 (Resource Owner)**:通常是最终用户,他们有权决定谁可以访问自己的受保护资源。 - **客户端 (Client)**:希望代表资源拥有者访问受保护资源的应用程序。 - **授权服务器 (Authorization Server)**:负责验证请求并向经过验证的客户端发放访问令牌。 - **资源服务器 (Resource Server)**:存储受保护资源的服务端实体,仅接受带有有效访问令牌的请求[^2]。 #### 认证流程详解 以下是典型的 OAuth 2.0 认证流程: 1. 用户尝试通过客户端访问某个受保护资源。 2. 如果尚未获得必要的权限,则客户端会重定向用户到授权服务器上的登录页面。 3. 用户在此处输入凭据以完成身份验证操作。 4. 成功后,授权服务器返回一个临时代码(authorization code),该代码会被发送回客户端。 5. 客户端利用此代码向授权服务器交换永久性的访问令牌(access token)以及可能存在的刷新令牌(refresh token)。 6. 使用所获令牌,客户端能够向资源服务器发起针对特定资源的有效请求[^3]。 #### 实现中的关键技术点 - **访问令牌 (Access Token)**:这是用于证明客户端已得到适当许可的关键组件;它具有时效性和范围限定属性。 - **刷新令牌 (Refresh Token)**:当原始访问令牌过期时可用来重新获取新的访问令牌而不需再次经历完整的授权过程。 - **多种授权模式支持**:包括但不限于授权码模式、隐式模式、密码模式和客户端证书模式等不同场景下的灵活适配方案[^1]。 ```python import requests def get_access_token(client_id, client_secret, authorization_code, redirect_uri): url = 'https://authorization-server.com/oauth/token' payload = { 'grant_type': 'authorization_code', 'code': authorization_code, 'redirect_uri': redirect_uri, 'client_id': client_id, 'client_secret': client_secret } response = requests.post(url, data=payload) if response.status_code == 200: tokens = response.json() return tokens['access_token'], tokens.get('refresh_token') else: raise Exception(f"Error obtaining access token: {response.text}") # Example usage of the function above to obtain an Access Token. try: access_token, refresh_token = get_access_token( client_id='your_client_id', client_secret='your_client_secret', authorization_code='auth_code_received_from_user_redirect', redirect_uri='http://localhost/callback' ) except Exception as e: print(e) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值