在开发 Web 应用程序时,很少有人会使用自己的身份验证系统。相反,他们往往将身份验证委托给第三方服务。OAuth2 是广泛使用的一种委托身份验证协议,它可以允许用户使用他们在第三方应用程序中的凭据来访问您的应用程序。本文将介绍如何使用 Deno 实现基于 OAuth2 的授权认证。
OAuth2 基本概念
在开始使用 OAuth2 之前,需要先了解 OAuth2 的一些基本概念。
授权服务器
授权服务器是负责授权的服务器。它负责向第三方应用程序颁发访问令牌,该令牌将允许第三方应用程序代表用户访问您的应用程序。
资源服务器
资源服务器是保护受保护资源的服务器。它将使用访问令牌来授权第三方应用程序代表用户访问受保护资源。
访问令牌
访问令牌是一种代表用户身份的令牌。它由授权服务器颁发,并用于访问资源服务器上的受保护资源。
刷新令牌
刷新令牌是一种允许用户过期或撤销访问令牌的令牌。它由授权服务器颁发,并用于颁发新的访问令牌。
OAuth2 认证类型
OAuth2 定义了四种授权类型,每种类型适用于不同的应用场景。
授权码模式
这是最常用的授权类型。用户将被重定向到授权服务器,要求用户输入凭据。如果认证成功,授权服务器将向资源服务器颁发一个授权码。资源服务器将使用该授权码来获取访问令牌。
隐式授权模式
此授权类型用于 JavaScript 应用程序,因为它可以避免将访问令牌存储在 JavaScript 代码中。以这种方式,资源服务器会直接向浏览器的 URL 栏返回访问令牌。
密码模式
密码模式需要用户提供他们的用户名和密码。这种模式不适用于公共应用程序,因为它要求用户提供其凭据。
客户端凭据模式
客户端凭据模式用于第三方应用程序可以直接访问资源服务器。访问令牌由授权服务器颁发,而不始于用户凭证。
Deno 实现 OAuth2 认证
要使用 Deno 实现基于 OAuth2 的授权认证,您需要使用一个依赖包。在本文中,我们将使用 oak 和 oauth2_client。
安装依赖包
deno install --allow-net --allow-read --allow-env --allow-plugin https://deno.land/x/oauth2_client/install.js
引入依赖包
我们将在应用程序中使用 oak 和 oauth2_client。
import { Application, Router } from "https://deno.land/x/oak/mod.ts"; import { OAuth2Client } from "https://deno.land/x/oauth2_client/mod.ts";
配置 OAuth2 客户端
在使用 OAuth2Client 之前,您需要通过创建一个配置对象来配置它。
const oauth2Client = new OAuth2Client({ clientId: "<CLIENT_ID>", clientSecret: "<CLIENT_SECRET>", redirectUri: "<REDIRECT_URI>", authorizationEndpoint: "<AUTHORIZATION_ENDPOINT>", tokenEndpoint: "<TOKEN_ENDPOINT>", scopes: ["<SCOPES>"] })
您需要替换上述值:
<CLIENT_ID>
:授权服务器为您的应用程序颁发的客户端 ID。<CLIENT_SECRET>
:授权服务器为您的应用程序颁发的客户端秘密。<REDIRECT_URI>
:用户登录成功后将重定向到的 URL。<AUTHORIZATION_ENDPOINT>
:授权服务器的授权终结点 URL。<TOKEN_ENDPOINT>
:授权服务器的令牌终结点 URL。<SCOPES>
:要请求的权限范围。
实现登录
可以使用路由处理程序来实现登录:
const router = new Router() router.get("/login", async (ctx) => { const authorizationUri = oauth2Client.authorizeUri({}) ctx.response.redirect(authorizationUri) })
在该函数中,我们使用 OAuth2Client 的 authorizeUri 方法来生成授权 URL。然后,我们使用 ctx.response.redirect 将用户重定向到该 URL。
处理回调
处理回调的最简单方法是使用 oak 的 use 函数:
-- -------------------- ---- ------- ------------- ----- -- - ----- ---- - ---------------------------------------- -- ------ - ----- ------ - ----- --------------------------- -- ------ -------- -------------- --- ---------------- ------------------- ----------------- - ------ -------- - ---- - ----------------- - ------ ------- - --展开代码
在这个例子中,我们检查查询参数中是否有一个 code。如果是这样,我们使用该 code 调用 OAuth2Client 的 getToken 方法来获取访问令牌。如果成功,我们将 tokens 打印到控制台,并向用户发送成功消息。否则,我们将发送失败消息。
结论
在本文中,我们介绍了 OAuth2 的基本概念和授权类型。然后,我们介绍了如何使用 Deno 和 oauth2_client 实现基于 OAuth2 的授权认证。您可以根据自己的需要和应用程序的要求自定义上述示例代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670f9c535f55128102660df8