如何仅从Netlify访问已登录用户(具有某些角色)的表单提交

时间:2018-07-20 07:39:58

标签: netlify

我有一个关于获取表单提交的问题,但仅适用于在我的应用程序中具有特定角色的注册用户。

我第一次失败的尝试:

我尝试创建一个lambda函数,该函数使用从客户端上的成功(邀请用户)登录名收到的access_token访问表单提交。但是,我只得到一个空的答复。

我的第二次尝试:

我创建了一个新的“个人”访问令牌,而不是使用用户的access_token,将其作为环境变量存储在Netlify上的应用程序中,并使用process.env.ACCESS_TOKEN在lambda函数中使用了该令牌。使用这种方法是有效的,并且我收到了所有表单提交。

这是我的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
    });
  });
}

我来自客户端的请求网址如下所示:  https://MY_DOMAIN.com/.netlify/functions/test?access_token=ACCESS_TOKEN

我想知道如何仅为具有特定角色的用户获取表单提交。我究竟做错了什么?我的方案的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

我向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
    });
  });
}