代码之家  ›  专栏  ›  技术社区  ›  John

如何仅访问登录用户(具有特定角色)从NetLify提交的表单

  •  0
  • John  · 技术社区  · 8 年前

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

    我的第一次失败尝试:

    我试图创建一个lambda函数,该函数使用 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 .

    我想知道如何为只有特定角色的用户获得表单提交。我做错什么了?对于我的场景,最佳实践是什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   John    8 年前

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