使用自定义 JSON web token 提供商嵌入经过身份验证的图表
许多网站使用的身份验证系统会生成 JSON web token来表示已登录的用户。如果您的网站生成JSON web token ,则可以配置 Atlas Charts 以验证现有令牌,从而授权呈现嵌入式图表。 或者,如果您的站点尚未使用JWT作为身份验证过程的一部分,您可以编写代码来显式生成JWT ,以便授权图表呈现。
本教程介绍后一种方法。 该示例向您展示如何为登录用户生成简单的JSON web token并将其发送到 Charts。
Charts 使用您在配置提供程序时提供的详细信息来验证它收到的带有渲染嵌入式图表请求的JWT 。 如果令牌无效或不符合您提供的详细信息,Charts 将不会呈现经过身份验证的图表视图。
先决条件
您必须是 Atlas 项目所有者才能为链接的 Charts 实例配置嵌入式身份验证提供程序。
步骤
为图表启用经过身份验证的嵌入
启用经过身份验证的嵌入以生成 Charts 基本 URL 和图表 ID。 您需要 Charts 基本 URL 和图表 ID 才能在网页上显示图表。
将 切换为Enable authenticated access On。
配置 Charts 以使用自定义 JSON web token 提供商
注意
使用自定义 JWT 提供程序配置身份验证时,您可以选择签名算法。 本教程使用 HS256 签名算法。 如果选择 RS256 签名算法,还可以选择以下签名密钥之一:
JSON Web 密钥 (JWK) 或JSON Web 密钥设立(JWKS) URL: Charts从指定URL的 JWK 或 JWKS文件中检索密钥。然后, Charts使用该密钥来验证JSON web token。 如果文件中有多个键, Charts会尝试每个键,直到找到匹配项为止。
PEM 公钥:Charts 使用指定的公钥来验证 JSON web token。
GoAuthentication Settings 视图。
注意
您必须是项目所有者才能访问权限Authentication Settings页面。 作为非管理员用户,您仍然可以使用嵌入式图表,但必须从项目所有者那里获取密钥。
单击 Authentication Settings 标签页。
创建一个 Web 应用程序来显示图表
如果您已有用于显示图表的应用,则已准备就绪。 如果没有,请继续执行其余步骤。
MongoDB 提供了一个预构建的示例,演示如何使用嵌入式 SDK 对使用JSON web token的嵌入式图表进行身份验证。
克隆Github 存储库 并按照 自述 文件中的说明开始使用该应用。您可以对其进行自定义,以使用之前创建的图表。
自定义 Node.js 应用
在应用程序服务器代码中,生成并返回JSON web tokenJSON web token 。实施因身份验证提供者而异。
警告
在服务器生成JSON web token以保护您的签名密钥免遭泄露。
app.js
当用户使用以下凭证登录应用程序时,示例应用程序中的文件使用简单的 Web 服务和包生成并返回使用算法签名的jsonwebtoken
JSON webHS256
token :
用户名:
admin
密码:
password
1 const express = require("express"); 2 const bodyParser = require("body-parser"); 3 const cors = require("cors"); 4 const jwt = require("jsonwebtoken"); 5 const config = require("./config.js"); 6 7 const app = express(); 8 const port = 8000; 9 10 // Configuring body parser middleware 11 app.use(bodyParser.urlencoded({ extended: false })); 12 app.use(bodyParser.json()); 13 app.use(cors()); 14 15 app.post("/login", (req, res) => { 16 const loginDetails = req.body; 17 // mock a check against the database 18 let mockedUsername = "admin"; 19 let mockedPassword = "password"; 20 21 if ( 22 loginDetails && 23 loginDetails.username === mockedUsername && 24 loginDetails.password === mockedPassword 25 ) { 26 let token = jwt.sign({ username: loginDetails.username }, config.secret, { 27 expiresIn: "24h" // expires in 24 hours 28 }); 29 res.json({ bearerToken: token }); 30 } else { 31 res.status(401).send(false); 32 } 33 }); 34 35 app.listen(port, () => console.log(`Example app listening on port ${port}!`));
注意
您的应用程序必须在令牌过期之前处理刷新或颁发新令牌的问题。
在示例应用程序中,签名密钥topsecret
在应用程序中名为config.js
的文件中定义:
module.exports = { secret: "topsecret" };
嵌入图表。
从
ChartsEmbedSDK
类创建一个新对象。 提供:baseUrl
属性的值以及指向您的 Charts 实例的 URL。 要将一个Atlas Charts嵌入到示例应用程序中,请将此值替换为“嵌入图表”对话框中的 :guilabel:Base URL
。chartId
属性,用于指定要嵌入的图表的唯一标识符。 要将一个Atlas Charts嵌入到示例应用程序中,请将此值替换为“嵌入图表”对话框中的 :guilabel:Chart ID
。getUserToken
属性,用于指定从身份验证提供商生成并返回JSON web token的函数。要提供的任何可选属性。 有关使用 SDK 嵌入Atlas Charts时可以使用的所有属性的列表,请参阅SDK 选项参考。
在示例应用程序的
src/index.js
文件中,getUserToken
属性中的login
函数会调用您创建的 Web 服务来生成JSON web token 。如果登录成功,该函数将向getUserToken
属性返回一个有效的JSON web token 。1 import ChartsEmbedSDK from "@mongodb-js/charts-embed-dom"; 2 import "regenerator-runtime/runtime"; 3 4 document 5 .getElementById("loginButton") 6 .addEventListener("click", async () => await tryLogin()); 7 8 function getUser() { 9 return document.getElementById("username").value; 10 } 11 12 function getPass() { 13 return document.getElementById("password").value; 14 } 15 16 async function tryLogin() { 17 if (await login(getUser(), getPass())) { 18 document.body.classList.toggle("logged-in", true); 19 await renderChart(); 20 } 21 } 22 23 async function login(username, password) { 24 const rawResponse = await fetch("http://localhost:8000/login", { 25 method: "POST", 26 headers: { 27 Accept: "application/json", 28 "Content-Type": "application/json" 29 }, 30 body: JSON.stringify({ username: username, password: password }) 31 }); 32 const content = await rawResponse.json(); 33 34 return content.bearerToken; 35 } 36 37 async function renderChart() { 38 const sdk = new ChartsEmbedSDK({ 39 baseUrl: "https://localhost/mongodb-charts-iwfxn", // ~REPLACE~ with the Base URL from your Embed Chart dialog 40 chartId: "d98f67cf-374b-4823-a2a8-f86e9d480065", // ~REPLACE~ with the Chart ID from your Embed Chart dialog 41 getUserToken: async function() { 42 return await login(getUser(), getPass()); 43 } 44 }); 对于要嵌入的每个图表,调用刚刚创建的对象的
CreateChart
方法。 要将一个Atlas Charts嵌入应用程序中,请将属性的值替换为“嵌入图表”对话框中的id
:guilabel:Chart ID
。以下示例显示了对示例应用程序中
src/index.js
文件中CreateChart
方法的调用。const chart = sdk.createChart({ chartId: "d98f67cf-374b-4823-a2a8-f86e9d480065" }); // ~REPLACE~ with the Chart ID from your Embed Chart dialog
部署并测试您的应用程序。
如果 Charts 可以验证通过呈现图表的请求收到的令牌,则它会呈现图表。 如果令牌无效,Charts 则不会呈现图表并显示错误代码。
有关 Charts 嵌入错误代码的更多信息,请参阅嵌入式错误代码。