Как мне связаться с Salesforce через функцию лямбда с JWT - PullRequest
0 голосов
/ 27 марта 2019

Я хочу знать, как связаться с Salesforce с помощью лямбда-функции.

Теперь я пытаюсь создать приложение Lambda, которое записывает информацию о клиентах при регистрации учетной записи на нашем сайте EC.
Поток данных следующий:

  1. регистрация информации об учетной записи наСайт EC
  2. Сайт EC сохраняет данные в DynamoDB
  3. Для вставки записи в триггеры DynamoDB для вызова лямбда-функции
  4. В лямбда-функции соединитесь с Salesforce и создайте пользовательскую запись

Я уже делал вышеуказанные действия с необработанным идентификатором пользователя / паролем + токеном.
Однако это не очень хорошо для нас по соображениям безопасности.

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

У меня есть 2 плана для достижения этих целей, но этого может быть недостаточно.

A.Использование Amazon Certificate Manager B. Выпустите сертификацию и секретный ключ на моем локальном ПК и сохраните его в хранилище параметров

Использование ACM кажется хорошим, но этот сервис не позволяет загружать секретный ключ, поэтому он не может использовать, я думаю,Выпуск 2 файлов на локальном компьютере также кажется успешным, но я не знаю, какой домен используется в лямбда-функции, и существует риск истечения срока сертификации.

В любом случае, я хочу вставить пользовательскую запись в Salesforce без какого-либо риска для безопасности.

Следующий код является лямбда-функцией, выполняющей вышеуказанные действия с угрозой безопасности.

import * as lambda from 'aws-lambda';
import * as jsforce from 'jsforce';

export const register: lambda.DynamoDBStreamHandler = async (event: lambda.DynamoDBStreamEvent, _context: lambda.Context): Promise<any> => {
  const connection: jsforce.Connection = await connect();
  const entities : Array<object> = convert(event.Records);

  await insertRecords(connection, entities);
}

function convert(records: lambda.DynamoDBRecord[]): Array<object>{
  let ret: Array<object> = [];
  records.forEach(record => {
    if(record.eventName !== 'INSERT'){
      return;
    }
    const row = record.dynamodb.NewImage;
    const id: string = row.customer_id.N;
    const name: string = row.name.S;
    const tel : string = row.tel.S;
    console.log(`convert: ${id}, ${name}, ${tel}`);
    const sfdcAccount:object = {
      AccountNumber: id,
      Name: name,
      Phone: tel
    }
    ret.push(sfdcAccount);
  });

  return ret;
}

async function connect():Promise<jsforce.Connection> {
  console.log('try to connect'); 
  const conn: jsforce.Connection = new jsforce.Connection({
    loginUrl: 'https://login.salesforce.com/'
  });
  const user = 'xxx@yyy.zzz';
  const pwd = 'password';
  const token = 'issued token';
  await conn.login(user, pwd+token, function (err, userInfo) {
    if (err) {
      console.log(err);
      throw Error(err.message);
    }
    console.log(`token: ${conn.accessToken}`);
    console.log(`url:   ${conn.instanceUrl}`);
    console.log(`id :   ${userInfo.id}`);
  });
  return conn;
}

async function insertRecords(con: jsforce.Connection, entities: Array<object> ): Promise<any>{
  await con.sobject("Account").create(entities, function (err, rets){
    if(err) {
      console.log(`error : ${err}`);
    }else{
      console.log(`ret : ${rets}`);
    }
  });
}

Я хочу изменить connect() метод устранения угрозы безопасности следующим образом:

async function connect():Promise<jsforce.Connection> {
  console.log('try to connect'); 
  const claim = {
    iss: ISSUER,
    aud: AUDIENCE,
    sub: 'xxx@yyy.zzz',
    exp: String(Date.now() + 3 * 60 * 1000)
  };
  const cert = undefined; //getting certification from somewhere
  const token = jwt.sign(claim, cert, {algorithm: 'RS256'});

  await request({
    method: 'POST',
    url: TOKEN_ENDPOINT_URL, 
    form: {
      grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
      assertion: token
    }
  }, function (err, response, body){
    const ret = JSON.parse(body);
    const conn = new jsforce.Connection({
      accessToken: ret.access_token, 
      instanceUrl: ret.instance_url
    });
    return conn;
  });
}

Кто-нибудь решает это?

...