就 Web 应用程序而言,Web 应用程序请求应该具有状态,会话是最常见的具有状态的方式。
当我们认为REST API 的请求最好是无状态的时,但是要验证和识别用户或客户端,有很多方法可以作为 OP 提到的。
下面解释了 REST API 中一些最常见的身份验证方式
1.基本认证
在基本身份验证中,用户发送由 base64 编码器编码的凭据。
凭证在 Authorization 标头中发送,带有基本前缀,如下所示。
"Basic "+ encodeUsingBase64(username+":"+password)
如果您的 REST API 受基本身份验证保护,则不属于应用程序的用户(不存在于服务器数据库中的用户)无法访问受保护的资源。
理想情况下,基本身份验证仅适用于应用程序用户
2. JWT/不记名令牌
JSON Web 令牌 (JWT) 是一个开放标准 (RFC 7519),其中服务器与客户端共享数字签名令牌,应用程序用户和非应用程序用户都可以使用它,服务器端逻辑从有效负载中提取用户信息令牌并使用它的数据库条目进行验证以进行授权。在这里,JWT 用例不受限制,某些实现负载也可以包含授权信息。单点登录是当今广泛使用 JWT 的一项功能。
与基本身份验证相比
3. API 密钥
它没有标准,它可能是随机生成的字符串发给 API 的用户。不同发行人的用例会有所不同。这里讨论得很好
4.Oauth2.0
Oauth2 是一个不同的类别。总而言之,它不是保护所有应用程序 API ,而是提供user resource对.third party applicationsconsent of user
它主要有4个部分。让我们以 Facebook 为例
1. 授权服务器 [Facebook]
2. 资源服务器 [Facebook 和资源将成为您的个人资料]
3. 客户端 [堆栈溢出、Quora、Candy Crush、Subway Surfer 等]
4. 资源所有者 [您(如果经过身份验证) )]
资源服务器可能由安全和不安全的 API 组成。访问安全 API 的客户端需要授权服务器颁发的 access_token。发出的 access_token 是一个随机字符串,也与关联的用户 scope( read, read_profile_info, write) 一起存储在授权服务器数据库中。
read此处资源所有者(您)同意授权服务器将范围( ,read-profile等)的 access_token 授予post-to-my-timeline客户端(Quora,,StackOverflow等Candy-Crush)
oauth2.0的优势
- 收到的 access_token 将同时具有身份验证和授权。因此,为 access_token 提供特定范围会很有帮助。
(比如堆栈溢出访问基本的个人资料信息,糖果粉碎访问更多信息,包括代表您发布的范围)
- access_token 的生命周期, refresh_token 的 grant_type。
访问令牌的生命周期有限。如果客户端应用程序需要在单个访问令牌的生命周期之外访问资源,它可以获得刷新令牌。刷新令牌允许客户端应用程序获取新的访问令牌。
授权类型:(授权码、隐式、密码、客户端凭据、刷新令牌)
笔记:
Oauth2 Auth 服务器不仅适用于 facebook 和 Google 等应用程序,而且您的应用程序可以设置 oauth2 服务器,并且您可以根据订阅/许可为您的客户提供不同范围的 access_token(将您的 API 与其应用程序集成)。
5.摘要认证
我还没有研究过摘要认证。有关更多详细信息,请参阅此线程
传输层安全要点
SSL
上述任何身份验证都与传输层安全性 (SSL) 有关,以确保您在后续请求中传递的凭据/令牌不会被捕获为纯文本。
X.509(优于 SSL)
SSL 证书由服务器发送给客户端。(任何向服务器发出请求的客户端都会收到 SSL 副本。没有限制,任何客户端都可以接收 SSL 证书)。
但在 X.509 客户端证书的情况下,使用服务器 SSL 证书创建,并与客户端秘密共享。客户端使用 X.509 证书与服务器通信。这里需要注意的一点是,对于不同的客户端,将生成不同的客户端证书来识别每个客户端。X.509 确保的是
安全性(没有客户端证书的人无法访问 API)
身份(服务器可以根据证书主题识别客户端)