在现代 web 应用程序中,RESTful API 已经成为了一个非常流行的架构模式。RESTful API 可以使得前端和后端分离,让前端与后端之间的通信更加简洁、快速、可扩展。然而,为了保护 API 的安全性,我们需要一种安全的方式来控制 API 的访问权限。OAuth2.0 是一种广泛使用的标准,可以为我们提供一种安全的方式来实现认证和授权。
OAuth2.0 简介
OAuth2.0 是一种授权框架,用于在不暴露用户凭据的情况下,允许第三方应用程序访问用户资源。OAuth2.0 规范定义了四种角色:
- 资源拥有者(Resource Owner):即用户,拥有资源的所有权。
- 客户端(Client):即第三方应用程序,需要访问用户资源。
- 授权服务器(Authorization Server):负责认证用户身份,并授权客户端访问用户资源。
- 资源服务器(Resource Server):存储用户资源,并负责对客户端的请求进行验证和授权。
OAuth2.0 规范定义了四种授权方式:
- 授权码(Authorization Code):适用于客户端能够安全保管客户端密钥的情况。
- 隐藏式(Implicit):适用于客户端无法安全保管客户端密钥的情况。
- 密码式(Resource Owner Password Credentials):适用于用户信任客户端的情况。
- 客户端凭证式(Client Credentials):适用于客户端需要访问自己的资源的情况。
RESTful API 认证授权
在 RESTful API 中,我们通常使用授权码和密码式这两种授权方式来实现认证和授权。
授权码授权
授权码授权是 OAuth2.0 中最常用的授权方式之一。它的工作流程如下:
- 客户端发起授权请求,将用户重定向到授权服务器。
- 用户在授权服务器上进行身份验证,并决定是否授权客户端访问资源。
- 如果用户授权,授权服务器将向客户端返回一个授权码。
- 客户端使用授权码向授权服务器请求访问令牌。
- 如果验证通过,授权服务器将向客户端返回一个访问令牌。
下面是一个授权码授权的示例代码:
// 假设我们的授权服务器地址为 https://auth.example.com // 假设我们的客户端 ID 为 client_id,客户端密钥为 client_secret // 假设我们的重定向 URI 为 https://example.com/callback // 第一步:客户端发起授权请求 const authorizeEndpoint = 'https://auth.example.com/authorize'; const redirectUri = 'https://example.com/callback'; const clientId = 'client_id'; const scope = 'read write'; const state = 'xyzabc123'; const responseType = 'code'; const authorizeUrl = `${authorizeEndpoint}?client_id=${clientId}&redirect_uri=${redirectUri}&scope=${scope}&state=${state}&response_type=${responseType}`; window.location.href = authorizeUrl; // 第二步:用户在授权服务器上进行身份验证,并决定是否授权客户端访问资源 // 第三步:授权服务器向客户端返回授权码 // 在重定向 URI 中获取授权码 const code = getParameterByName('code'); // 第四步:客户端使用授权码向授权服务器请求访问令牌 const tokenEndpoint = 'https://auth.example.com/token'; const grantType = 'authorization_code'; const tokenRequest = { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Basic ${btoa(`${clientId}:${clientSecret}`)}` }, body: `grant_type=${grantType}&code=${code}&redirect_uri=${redirectUri}` }; const response = await fetch(tokenEndpoint, tokenRequest); const data = await response.json(); // 第五步:授权服务器向客户端返回访问令牌 const accessToken = data.access_token;
密码式授权
密码式授权是 OAuth2.0 中另一种常用的授权方式。它的工作流程如下:
- 客户端向授权服务器发送用户凭据(用户名和密码)。
- 如果用户凭据验证通过,授权服务器将向客户端返回一个访问令牌。
下面是一个密码式授权的示例代码:
// 假设我们的授权服务器地址为 https://auth.example.com // 假设我们的客户端 ID 为 client_id,客户端密钥为 client_secret // 假设我们的用户名为 alice,密码为 password // 第一步:客户端向授权服务器发送用户凭据 const tokenEndpoint = 'https://auth.example.com/token'; const grantType = 'password'; const username = 'alice'; const password = 'password'; const tokenRequest = { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': `Basic ${btoa(`${clientId}:${clientSecret}`)}` }, body: `grant_type=${grantType}&username=${username}&password=${password}` }; const response = await fetch(tokenEndpoint, tokenRequest); const data = await response.json(); // 第二步:授权服务器向客户端返回访问令牌 const accessToken = data.access_token;
总结
OAuth2.0 是一种安全的方式来实现 RESTful API 的认证和授权。在使用 OAuth2.0 实现认证和授权时,我们通常使用授权码和密码式这两种授权方式。授权码授权适用于客户端能够安全保管客户端密钥的情况,密码式授权适用于用户信任客户端的情况。在实际开发中,我们应该根据具体情况选择合适的授权方式,确保 API 的安全性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c35d61add4f0e0ffda340f