获取authorization_刚教完面试官OAuth 2.0为什么要先获取授权码code

OAuth2.0授权码流程通过授权码来确保安全和用户体验。资源拥有者授权第三方软件访问其公众号文章,授权码在浏览器中安全传递,后端服务交换访问令牌。这一过程防止了访问令牌直接暴露,同时允许用户在授权后重新与第三方软件建立连接。

xx软件最终是通过访问令牌请求到我的公众号里的文章。访问令牌是通过授权码换来的。你有想过为何要用授权码换令牌,而不直接颁发访问令牌呢?

OAuth 2.0 的角色

资源拥有者、客户端(即第三方软件)、授权服务和受保护资源。

  • 资源拥有者=> 我
  • 客户端 => xx软件
  • 授权服务 -> 公众号开放平台的授权服务
  • 受保护资源 -> 我的公众号里的文章

03dce7f3d1050f1acfaff1b5acde4dc1.png

一定要授权码吗?

第 4 步授权服务生成授权码,倘若我们不要授权码,这步直接返回访问令牌access_token 。那就不能重定向,因为这样会把安全保密性要求极高的访问令牌暴露在浏览器,增加访问令牌失窃风险。这显然不行的呀!即若无授权码,就只能把访问令牌发给第三方软件的后端服务:

651ac01e0996f393aa1c9736902ba513.png

看着好像没问题?我访问xx软件,xx软件说要排版文章我得给它授权,不然vx公众号不干,然后xx软件就引导我跳转到了公众号的授权服务。到授权服务之后,开放平台验证xx的合法性及我的登录状态后,生成授权页面。我赶紧扫码同意授权,于是开放平台知道可以把我的文章数据给xx软件。

于是,开放平台生成访问令牌 access_token,并且通过后端服务方式返回给xx软件。xx就能正常工作。

但是当我被浏览器重定向到授权服务,我和xx间的连接就断了,相当于此时我和授权服务建立连接后,将一直“停留在授权服务页面”。我再也没有重连到xx。

但这时xx已拿到我授权后的访问令牌,也使用访问令牌获取了我的号里的文章数据。这时,考虑我的感受。xx应该要通知到我,但是如何做呢?现在连接可是断了的呀! 为了让xx通知到我,我必须跟xx重建 “连接”。即第二次重定向,我授权后,又重新重定向回到xx的地址,这样我就跟xx有了新连接。

为重建连接,又不能暴露访问令牌,就有这样的临时、间接凭证:授权码。因为xx最终要拿到高安全要求的访问令牌,并非授权码,授权码可以暴露在浏览器。 有了授权码,访问令牌可以在后端服务间传输,同时还可重建我&xx间的连接。 所以,通过授权码,既考虑了我的用户体验,又考虑了通信安全。

执行授权码流程时,授权码和访问令牌在xx和授权服务间到底怎么流转的?

授权码许可类型的通信过程

间接通信

间接通信就是指获取授权码的交互。

1ff04a3771cb7ff8830607229b04b057.png

我:“xx,我要访问你了。” xx:“我把你引到授权服务,我需要授权服务给我一个授权码。” 授权服务:“xx,我把授权码发给浏览器了。” 小兔软件:“ 那我从浏览器拿到了授权码。”

xx和授权服务间,并无直接通信,而是通过中间人(浏览器).

直接通信

授权码换取访问令牌的交互,是“直接”的。

7ce534a17c971bc62a6c35b692276d68.png

三方软件xx获取到授权码后,向授权服务发起获取访问令牌 access_token 的请求。

三方软件要代表资源拥有者去访问受保护资源 授权服务负责颁发访问令牌,受保护资源负责接收并验证访问令牌。

开发微信小程序场景

比如获取用户登录态信息的过程:

  • 通过 wx.login(Object object) 获取登录凭证 code,该步是在小程序内部通过调用微信提供的 SDK 实现的
  • 再通过该 code 换取用户的 session_key 等信息,即官方文档的 auth.code2Session 方法,同时该方法也是被强烈建议通过开发者的后端服务来调用

参考

  • https://leokongwq.github.io/2017/02/28/why-oauth2-use-authorization-code.html
  • https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
  • https://segmentfault.com/q/1010000014642301
  • https://tools.ietf.org/html/rfc6749
### 获取 Google OAuth2.0 授权码的方法 要获取 Google OAuth2.0 授权码,首需要理解 OAuth2.0 授权码模式的基本流程。此模式涉及四个主要角色:资源所有者(用户)、客户端(应用)、授权服务器(Google)和资源服务器(Google API)。以下是具体步骤: 1. **注册应用**:在 Google Cloud Console 中创建项目,并注册 OAuth2.0 客户端 ID。你需要提供重定向 URI,这是用户授权后将被重定向到的 URL。 2. **构建授权请求**:构造一个指向 Google 授权端点的 URL,用户将被重定向到这个 URL 以进行授权。URL 的格式如下: ``` https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email& access_type=offline& redirect_uri=https%3A%2F%2Foauth2.example.com%2Fcallback& response_type=code& client_id=your_client_id& state=state_parameter& prompt=consent ``` 其中,`scope` 参数定义了你希望访问的资源范围,`redirect_uri` 是用户授权后的回调地址,`client_id` 是你在 Google Cloud Console 中获得的客户端 ID,`state` 是用于防止 CSRF 攻击的状态参数,`prompt` 用于控制用户交互行为 [^2]。 3. **处理用户授权**:用户访问上述 URL 后,会被引导到 Google 的登录页面。用户登录并同意授权后,Google 会将用户重定向回你指定的 `redirect_uri`,并在 URL 中附带一个授权码。 4. **获取访问令牌**:使用授权码向 Google 的令牌端点请求访问令牌。可以通过发送 POST 请求来实现: ```http POST /token HTTP/1.1 Host: oauth2.googleapis.com Content-Type: application/x-www-form-urlencoded code=your_authorization_code& client_id=your_client_id& client_secret=your_client_secret& redirect_uri=https://oauth2.example.com/callback& grant_type=authorization_code ``` 其中,`code` 是从上一步获取授权码,`client_id` 和 `client_secret` 是你在 Google Cloud Console 中获得的客户端 ID 和密钥,`redirect_uri` 必须与注册时一致,`grant_type` 指定为 `authorization_code` [^1]。 5. **使用访问令牌**:成功获取访问令牌后,你可以使用该令牌访问受保护的资源。例如,可以使用访问令牌调用 Google Userinfo API 获取用户信息: ```http GET /userinfo/v2/me HTTP/1.1 Host: www.googleapis.com Authorization: Bearer your_access_token ``` ### 示例代码 以下是一个简单的 Python 示例,展示如何使用 `requests` 库获取访问令牌: ```python import requests # 替换为你的客户端ID、客户端密钥和授权码 client_id = 'your_client_id' client_secret = 'your_client_secret' authorization_code = 'your_authorization_code' redirect_uri = 'https://oauth2.example.com/callback' # 请求访问令牌 token_url = 'https://oauth2.googleapis.com/token' data = { 'code': authorization_code, 'client_id': client_id, 'client_secret': client_secret, 'redirect_uri': redirect_uri, 'grant_type': 'authorization_code' } response = requests.post(token_url, data=data) token_response = response.json() # 输出访问令牌 access_token = token_response.get('access_token') print(f'Access Token: {access_token}') ``` ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值