如何仅从 Netlify 访问登录用户(具有特定角色)的表单提交
How to access form submissions from Netlify for logged in users (with certain roles) only
我对获取表单提交有疑问,但仅限于在我的应用程序中具有特定角色的注册用户。
我第一次失败的尝试:
我试图创建一个 lambda 函数,它使用从我的客户端上成功(邀请用户)登录收到的 access_token
访问表单提交。但是,我只收到一个空响应。
我的第二次尝试:
我创建了一个新的个人访问令牌,而不是使用用户的 access_token,将其作为环境变量存储在我在 Netlify 上的应用程序中,然后我在我的 lambda 函数中使用令牌 process.env.ACCESS_TOKEN
.使用这种方法是有效的,我收到了所有的表单提交。
这是我的 lambda 函数,test.js:
const request = require('request');
exports.handler = function(event, context, callback) {
let ACCESS_TOKEN = process.env.ACCESS_TOKEN; // when using my personal API token created in Netlify. Does work
let ACCESS_TOKEN = event["queryStringParameters"]['access_token']; // passing the user's `access_token` from the client in request url. Does not work.
const options={
url: "https://api.netlify.com/api/v1/sites/MY_SITE_ID/forms/MY_FORM_ID/submissions",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${ACCESS_TOKEN}`
}
}
request(options, (error, response, body) => {
console.log("access_token", ACCESS_TOKEN); // I know the ACCESS_TOKEN is present in both of my scenarios.
callback(null, {
headers: { "Access-Control-Allow-Origin": "http://localhost:4200","Access-Control-Allow-Headers": "Content-Type"},
statusCode: 200,
body: body
});
});
}
我的客户请求 url 如下所示:
https://MY_DOMAIN.com/.netlify/functions/test?access_token=ACCESS_TOKEN.
我想知道如何才能让具有特定角色的用户提交表单。我究竟做错了什么?我的场景的最佳做法是什么?
我将问题发送给了 Netlify 的团队,他们能够帮助我解决问题。似乎我发送到 lamdba 函数的 acces_token 是一个 JWT(json 网络令牌)。我需要做的就是解码和验证 JWT 以访问我的数据。然后我可以使用从 JWT 解码的用户对象来读取角色。我最终使用了类似这样的代码:
const request = require('request');
const jwt = require('jsonwebtoken');
exports.handler = function(event, context, callback) {
const JWT_SECRET = "MY SECRET"; // secret used to verify the signature of the jwt
let ACCESS_TOKEN;
let user;
if (event && event.queryStringParameters && event.queryStringParameters.access_token) {
const jwt_token = event.queryStringParameters.access_token;
jwt.verify(jwt_token, JWT_SECRET,
(err, decoded) => {
user = decoded;
});
}
if(user && user.app_metadata && user.app_metadata.roles &&
(user.app_metadata.roles.includes("admin") || user.app_metadata.roles.includes("editor"))){
if(process.env && process.env.ACCESS_TOKEN){
ACCESS_TOKEN = process.env.ACCESS_TOKEN;
}
}
const options={
url: "https://api.netlify.com/api/v1/sites/SITE_ID/forms/FORM_ID/submissions",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${ACCESS_TOKEN}`
}
};
request(options, (error, response, body) => {
callback(null, {
headers: { "Access-Control-Allow-Origin": "http://localhost:4200","Access-Control-Allow-Headers": "Content-Type"},
statusCode: 200,
body: body
});
});
}
我对获取表单提交有疑问,但仅限于在我的应用程序中具有特定角色的注册用户。
我第一次失败的尝试:
我试图创建一个 lambda 函数,它使用从我的客户端上成功(邀请用户)登录收到的 access_token
访问表单提交。但是,我只收到一个空响应。
我的第二次尝试:
我创建了一个新的个人访问令牌,而不是使用用户的 access_token,将其作为环境变量存储在我在 Netlify 上的应用程序中,然后我在我的 lambda 函数中使用令牌 process.env.ACCESS_TOKEN
.使用这种方法是有效的,我收到了所有的表单提交。
这是我的 lambda 函数,test.js:
const request = require('request');
exports.handler = function(event, context, callback) {
let ACCESS_TOKEN = process.env.ACCESS_TOKEN; // when using my personal API token created in Netlify. Does work
let ACCESS_TOKEN = event["queryStringParameters"]['access_token']; // passing the user's `access_token` from the client in request url. Does not work.
const options={
url: "https://api.netlify.com/api/v1/sites/MY_SITE_ID/forms/MY_FORM_ID/submissions",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${ACCESS_TOKEN}`
}
}
request(options, (error, response, body) => {
console.log("access_token", ACCESS_TOKEN); // I know the ACCESS_TOKEN is present in both of my scenarios.
callback(null, {
headers: { "Access-Control-Allow-Origin": "http://localhost:4200","Access-Control-Allow-Headers": "Content-Type"},
statusCode: 200,
body: body
});
});
}
我的客户请求 url 如下所示: https://MY_DOMAIN.com/.netlify/functions/test?access_token=ACCESS_TOKEN.
我想知道如何才能让具有特定角色的用户提交表单。我究竟做错了什么?我的场景的最佳做法是什么?
我将问题发送给了 Netlify 的团队,他们能够帮助我解决问题。似乎我发送到 lamdba 函数的 acces_token 是一个 JWT(json 网络令牌)。我需要做的就是解码和验证 JWT 以访问我的数据。然后我可以使用从 JWT 解码的用户对象来读取角色。我最终使用了类似这样的代码:
const request = require('request');
const jwt = require('jsonwebtoken');
exports.handler = function(event, context, callback) {
const JWT_SECRET = "MY SECRET"; // secret used to verify the signature of the jwt
let ACCESS_TOKEN;
let user;
if (event && event.queryStringParameters && event.queryStringParameters.access_token) {
const jwt_token = event.queryStringParameters.access_token;
jwt.verify(jwt_token, JWT_SECRET,
(err, decoded) => {
user = decoded;
});
}
if(user && user.app_metadata && user.app_metadata.roles &&
(user.app_metadata.roles.includes("admin") || user.app_metadata.roles.includes("editor"))){
if(process.env && process.env.ACCESS_TOKEN){
ACCESS_TOKEN = process.env.ACCESS_TOKEN;
}
}
const options={
url: "https://api.netlify.com/api/v1/sites/SITE_ID/forms/FORM_ID/submissions",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${ACCESS_TOKEN}`
}
};
request(options, (error, response, body) => {
callback(null, {
headers: { "Access-Control-Allow-Origin": "http://localhost:4200","Access-Control-Allow-Headers": "Content-Type"},
statusCode: 200,
body: body
});
});
}