JWT 是一种令牌格式,用于OAuth2 和OpenID Connect 等安全协议。
如何从授权服务器获取令牌取决于您使用的授权流程。
OAuth 2.0 中定义了 4 个授权流,用于不同的客户和用途。
- 授权码授予
此授权适用于 Web 应用程序。用户的浏览器被重定向 (HTTP 302) 到授权服务器。授权服务器负责对用户进行身份验证(通过用户名/密码、智能卡、2 因素身份验证等)。
然后,授权服务器将浏览器重定向回 Web 应用程序中使用代码预先注册的端点。然后,Web 应用程序使用它自己的凭据(客户端 ID 和客户端密码)和授权代码从授权服务器请求访问令牌。
授权服务器向 Web 应用程序返回访问令牌和刷新令牌。请注意,浏览器(不受信任)永远不会看到访问令牌。只有 Web 应用程序(受信任)可以访问访问令牌和刷新令牌。
此授权很难从 Web 应用程序以外的其他客户端使用,因为它基于 HTTP 重定向。
- 隐式授权
此授权用于不受信任的客户端,例如 JavaScript 应用程序或第 3 方移动客户端(您从应用商店下载的客户端)。
它还将浏览器(或浏览器控件)重定向到授权服务器,但不是在成功验证后向浏览器返回代码,而是直接返回访问令牌。由于客户端不受信任,因此授权不会返回刷新令牌。访问令牌需要存储在某个地方,并且容易受到 XSS 攻击。
即使您没有获得刷新令牌,但某些实现确实提供了一种获取新访问令牌的方法,方法是在隐藏的 IFRAME 中与授权服务器通信,并使用 cookie 与授权服务器本身进行身份验证。
- 资源所有者密码凭据授予
此授权适用于受信任的客户端,例如具有安全存储功能的桌面应用程序或第一方移动应用程序。客户端应用程序向用户(资源所有者)询问他们的用户名/密码,然后将其发送到授权服务器以获取访问令牌和刷新令牌。
一旦客户端拥有访问令牌,它可以丢弃密码,因为它可以使用刷新令牌来获取新的访问令牌。这使其比基本身份验证更安全。
此授权不依赖于浏览器重定向,并且可以在任何可以执行 HTTP 请求的应用程序中轻松使用。
- 客户端凭据授予
此授权旨在验证客户端(应用程序)而不是客户端的用户。
在这种情况下,客户端将其客户端 ID 和机密直接提交给授权服务器以获取访问和刷新令牌。
所以基本上前两个授权依赖于类似浏览器的功能(HTTP 重定向、HTML 登录页面),而其他两个授权只需要一个 HTTP 堆栈来与授权服务器通信。