OAuth Faq

Last Modified: 2022/12/12

概述

本篇整理 OAuth 一些常见问题供大家参考。

为什么需要 Authorization Code

完整的问题是为什么要 authorization code,为什么不直接给 accessToken?这样不是更方便吗?回答这个问题之前我们先简单介绍下授权码模式,授权码模式的第一步就是将用户导向认证服务器的某个端点(Endpoint)认证用户身份,一般上这个端点类似以下这样:

GET /authorize?response_type=code&client_id=b7BhdVkqt3&state=abc&redirect_uri=https://www.some-third-party-app/auth/callback HTTP/1.1
Host: auth.server.com

从端点中可以看出,有个 client_id 参数,这是三方 app 的身份标识,需要预先注册到认证服务器上。当用户在该端点完成自己的认证并确认授权后,浏览器会重定向到 redirect_uri 指定的地址,注意这个 redirect_uri 需要进行 url 编码,这里为了方便大家阅读,因此没有编码。实际上经过编码后的 redirect_uri 长下面这样:

https%3A%2F%2Fwww.some-third-party-app%2Fauth%2Fcallback

注:不知道怎么进行 url 编码的同学,可以使用这里的在线工具编码完成编码。

当用户完成认证并确认授权第三方 app 后,会重定向到 redirect_uri 指定的地址,并带上授权码(code),像下面这样:

https://www.some-third-party-app/auth/callback?code=123abc

第三方 app 拿到授权码后,使用自己的 client_id、client_secret 和 code 换取 accessToken。这一步认证了第三方 app,确保了这个 code 确实是颁发给 client_id 指定的第三方 app。

所以这个问题的答案就是为了安全,第一步获取授权码是从浏览器(即用户代理)发起的,浏览器是没有第三方 app 的 client_secret 的,如果将 client_secret 放到 /authorize 端点中,可能会导致 client_secret 泄露,造成安全问题。第二步则是为了认证第三方 app,确保 code 不会被其他未经用户授权的 app 使用。

为什么需要 Access Token 和 Refresh Token

  • access token 一般时短期的,而 refresh token 相对时间较长。如果不幸泄露了 access token,那么黑客也只能使用有限的时间。
  • 问题是如果 access token 不幸泄露,那么 refresh token 就能够幸免吗?假如 refresh token 也泄露了,那么会怎样?答案是不怎样,因为仅有 refresh token 是无法刷新 access token 的,需要 access token+appid+app secret

除了以上两点,还有一点是出于安全考虑:

There is a security reason, the refresh_token is only ever exchanged with authorization server whereas the access_token is exchanged with resource servers. This mitigates the risk of a long-lived access_token leaking in the "an access token good for an hour, with a refresh token good for a year or good-till-revoked" vs "an access token good-till-revoked without a refresh token."

有问题吗?点此反馈!

温馨提示:反馈需要登录