Как получить доступ к отправке форм из Netlify только для зарегистрированных пользователей (с определенными ролями)

У меня есть вопрос о получении отправки формы, но только для зарегистрированных пользователей с определенной ролью в моем приложении.

Моя первая неудачная попытка:

Я попытался создать лямбда-функцию, которая получает доступ к отправке формы, используя access_token, полученный от успешного входа в систему (приглашение пользователя) на моем клиенте. Однако я получаю только пустой ответ.

Моя вторая попытка:

Вместо использования access_token пользователя я создал новый токен личного доступа, сохранил его как переменную среды в своем приложении на Netlify и использую токен в своей лямбда-функции, используя process.env.ACCESS_TOKEN. Использование этого подхода допустимо, и я получил все отправленные формы.

Вот моя лямбда-функция 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.

Мне интересно, как я могу получить представление формы только для пользователей с определенными ролями. Что я делаю не так? Какова наилучшая практика для моего сценария?


person John    schedule 20.07.2018    source источник


Ответы (1)


Я отправил свой вопрос команде Netlify, и они смогли мне помочь. Похоже, что access_token, который я отправлял в функцию lamdba, был 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
    });
  });
}
person John    schedule 23.07.2018