目录

Auth0 的 OAuth 2.0 方案

目录

Auth0,一家“Identity-as-a-service”提供商。开发中的认证和授权是不可避免的,现如今互联网上的开放授权协议很多,如OpenID、OAuth2.0、SMAL等,当你想通过第三方登录时,你可能会遇到Weibo、QQ它们实现的协议都不同的情况,那你就必须针对它们使用的协议编写程序,这对开发人员前期编写、后期维护都很不方便。

Auth0 的角色就是一个代理人,帮你联通自己的系统和第三方系统,它把主流的授权协议都实现并封装好了,为多种主流语言提供了 SDK,当你的系统要支持第三方登录时,只需要调用 Auth0 的 API 即可。(但听说文档写的很差)

Auth0的产品策略:免费(登陆用户数小于1000)+ 定制。

允许用户在一个站点授予该站点有限的权限以获取用户的资源,而不用暴露另一个站点的凭证。

默认格式是 JWT ,在 OAuth 2.0 中权限被称作 scopes ,例如:read:contactscreate:contacts

  • Resource Owner
  • Resource Server
  • Client
  • Authorization Server

https://cdn.jsdelivr.net/gh/dfface/img0/0/y7Owub-wqGE1k.jpg

OAuth 2.0 Authorization Framework specification 定义了获取 Access Token 的四种方式,它们被称作 grant types。具体选择哪一种取决于你的 APP 的类型。

分别是:

https://cdn.jsdelivr.net/gh/dfface/img0/0/ybVybp-HcRzQb.jpg

Authorization Code Flow 单独使用时无法减轻安全威胁,因为:

对于 Native apps:

  • 不能安全保存一个 Client Secret。反编译这个 app 就会揭示这个 Client Secret(与该 app 绑定,对所有用户和设备都是一致的)。
  • 可能允许恶意 app 通过使用自定义的 URL 模式(如 MyApp://)来获取授权码。

对于 SPA:

  • 不能安全保存一个 Client Secret,因为它的资源对浏览器来说都可用。

为了减轻这些安全问题,OAuth 2.0 提供了一个能利用 Proof Key for Code Exchange (PKCE) 的授权码工作流版本。原理是 app 创建一个 Code Verifier 并通过 HTTPS 传输 Code Challenge(Code Verifier 的 transform value) 以获取授权码,这样以来,潜在的攻击者只能拦截到授权码,但是因为没有 Code Verifier 就不能用它获取 Token。

https://cdn.jsdelivr.net/gh/dfface/img0/0/T2Qmy7-BIe1fq.jpg

注意: OAuth 2.0 BCP 规定你 不应该 使用 Implicit Flow 从 Authorization Server 来请求 Access Tokens. 鉴于此,我们推荐你使用 Authorization Code Flow with PKCE 如果你的 single-page app (SPA) 需要 Access Tokens for Cross-Origin Resource Sharing (CORS) requests.

这种方式已经不是请求 Access Token 的最佳实践,如果只需要 ID Token 的话,那确实是合适的。

Implicit Flow 中,发布的 Token 是 short-lived ,并且 Refresh Token 不可用。

https://cdn.jsdelivr.net/gh/dfface/img0/0/De4CHv-6Pm2Yw.jpg

使用用户名和密码,以获取 Access Token。

因为这个模式取得了用户密码,因此一定不要用于第三方 client。

Auth0 recommends:

https://cdn.jsdelivr.net/gh/dfface/img0/0/JqDPev-gF6TGd.png

machine-to-machine (M2M) 的应用,如 daemons、CLIs 或后台服务,系统要认证和授权的是 app 而不是 用户。在这种场景下,通常的鉴权模式如 username + password 或者 social logins 将没有任何用处。

Client Credentials Flow (defined in OAuth 2.0 RFC 6749, section 4.4) ,通过传递 Client ID 和 Client Secret 来获取 Token。

https://cdn.jsdelivr.net/gh/dfface/img0/0/887Isi-RUxhwg.jpg


参考文献:

Auth0: OAuth 2.0 Authorization Framework

RFC6749: The OAuth 2.0 Authorization Framework

Auth0 — ID认证服务提供商