使用授权器授权nodejs apis
#javascript #开源 #node #身份验证

在此博客文章中,我们将根据使用Authorizer的有效会议和角色来学习如何授权用户进行API调用。 Authorizer是一种开源数据库独立的auth解决方案。您可以携带数据库,并准备好身份验证和授权服务。

出于演示目的,我们将使用[express](https://expressjs.com/)服务器并编写一个中间件,该中间件将基于Authorization header中的JWT(JSON Web令牌)验证用户会话和角色。

请参阅github上的源代码。

步骤1:设置授权器实例

使用下面可用的一键部署选项部署生产的授权实例

下属提供商 一键式链接 其他信息
铁路。App Deploy on Railway docs
Heroku Deploy to Heroku docs
渲染 render button docs

有关更多信息和部署选项,例如Docker / Kubernetes / Helm图表,请参阅docs < / p>

配置实例

  • 在浏览器中打开授权器实例端点

  • 注册为具有安全密码的管理员

  • 从仪表板配置环境变量。检查env docs以获取更多信息。

    注意:DATABASE_URLDATABASE_TYPEREDIS_URL是只能将其配置为授权者实例的系统环境变量的变量。

步骤2:创建Express App

注意:如果您已经有一个nodejs应用程序启动并运行

,则此步骤是可选的。
  • 设置项目

    # Create directory
    mkdir my-apis
    
    # Change directory
    cd my-apis
    
    # Initialize nodejs APP
    npm init -y
    
    # Install express
    npm install express
    
    # Create index.js
    touch index.js
    
  • 将启动命令添加到package.json

    {
      "name": "my-apis",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "start": "node index.js",
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "keywords": [],
      "author": "Lakhan Samani",
      "license": "ISC",
      "dependencies": {
        "express": "^4.18.2"
      }
    }
    
  • 设置Express应用程序并在index.js中创建基本API

    // index.js
    const express = require('express');
    
    const app = express();
    const port = `3000`;
    
    app.get('/', (req, res) => {
      res.send('Hello World');
    });
    
    app.listen(port, () => {
      console.log(`[server]: Server is running at http://localhost:${port}`);
    });
    

步骤3:创建授权中间件

  • 安装@authorizerdev/authorizer-js

    npm i --save @authorizerdev/authorizer-js
    
  • 创建auth_middleware.js

    touch auth_middleware.js
    
  • 实施授权中间件

    // auth_middleware.js
    
    const { Authorizer } = require("@authorizerdev/authorizer-js");
    
    const authRef = new Authorizer({  
      authorizerURL: "AUTHORIZER_URL_FROM_STEP 1",
      redirectURL: "FRONTEND_URL",
      clientID: "AUTHORIZER_CLIENT_ID FROM DASHBOARD"
    });
    
    const authMiddleware = async (req, res, next) => {
        const authHeader = req.headers.authorization;
      if (!authHeader) {
        return res.status(403).json({ error: "Authorization not found" });
      }
    
      const splitHeader = authHeader.split(" ");
      if (splitHeader.length != 2) {
        return res.status(403).json({ error: "Invalid auth header" });
      }
    
      if (splitHeader[0].toLowerCase() != "bearer") {
        return res.status(403).json({ error: "Bearer token not found" });
      }
    
      const token = splitHeader[1];
      // Validate jwt token via authorizer sdk
      try {
        const res = await authRef.validateJWTToken({
          token,
          token_type: "id_token", // This can be access_token, refresh_token
           // roles: [user] // specify roles that you want to validate jwt for, by default it will just verify jwt.
        });
        req.user = res.claims;
      } catch (err) {
        console.error(err);
        return res.status(403).json({ error: "Invalid JWT token" });
      }
    
      next();
    }
    
    module.exports = authMiddleware
    

步骤4:将身份中间件添加到API

更新index.js以及以下内容

// index.js
const express = require('express');
const authMiddleware = require('./auth_middleware')

const app = express();
const port = `3000`;

app.get('/', authMiddleware, (req, res) => {
  res.send('Hello World');
});

app.listen(port, () => {
  console.log(`[server]: Server is running at http://localhost:${port}`);
});

步骤5:测试API

  • 启动API服务器

    npm start
    
  • 做一个卷曲请求

    curl http://localhost:3000
    

注意:这将返回错误,因为我们没有使用有效的JWT令牌指定授权标头

  • 要通过此测试,我们需要具有有效的JWT令牌,因此让我们通过对授权器服务器进行登录调用来生成有效的JWT

    # Replace Authorizer URL from step 1
    # Replace credentials with right credentials in --data-raw (demo@yopmail.com, Test@123#)
    # If you have no user on your instance, first signup using AUTHORIZER_URL_FROM_STEP_1/app?redirect_uri=AUTHORIZER_URL_FROM_STEP_1/app
    
    curl --location --request POST 'AUTHORIZER_URL_FROM_STEP_1/graphql' \
    --header 'Content-Type: application/json' \
    --data-raw '{"query":"mutation login {\n  login(params: {\n    email: \"demo@yopmail.com\",\n    password: \"Test@123#\"\n  }) {\n    id_token\n  }\n}","variables":{}}'
    

    这应该返回id_token的响应,如下屏幕截图所示。将id_token从响应中复制,然后传递到我们的nodejs api服务器

  • 测试API

    curl --header 'Authorization: Bearer TOKEN_COPIED_FROM_ABOVE_STEP' http://localhost:3000
    

这就是我希望这可以帮助您轻松授权API,并根据正确的会话和角色使其安全。

有关更多信息,请查看下面的链接。