在此博客文章中,我们将根据使用Authorizer的有效会议和角色来学习如何授权用户进行API调用。 Authorizer是一种开源数据库独立的auth解决方案。您可以携带数据库,并准备好身份验证和授权服务。
出于演示目的,我们将使用[express](https://expressjs.com/)服务器并编写一个中间件,该中间件将基于Authorization
header中的JWT(JSON Web令牌)验证用户会话和角色。
请参阅github上的源代码。
步骤1:设置授权器实例
使用下面可用的一键部署选项部署生产的授权实例
有关更多信息和部署选项,例如Docker / Kubernetes / Helm图表,请参阅docs < / p>
配置实例
-
在浏览器中打开授权器实例端点
-
注册为具有安全密码的管理员
-
从仪表板配置环境变量。检查env docs以获取更多信息。
注意:
DATABASE_URL
,DATABASE_TYPE
,REDIS_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,并根据正确的会话和角色使其安全。
有关更多信息,请查看下面的链接。
Website: https://authorizer.dev
-
文档:https://docs.authorizer.dev p> li>
-
JavaScript SDK:https://github.com/authorizerdev/authorizer-js
-
YouTube:https://youtube.com/playlist?list=PLSQGbUjHc6bpaAgCiQPzNxiUPr7SkDAFR