Я хочу знать, как связаться с Salesforce с помощью лямбда-функции.
Теперь я пытаюсь создать приложение Lambda, которое записывает информацию о клиентах при регистрации учетной записи на нашем сайте EC.
Поток данных следующий:
- регистрация информации об учетной записи наСайт EC
- Сайт EC сохраняет данные в DynamoDB
- Для вставки записи в триггеры DynamoDB для вызова лямбда-функции
- В лямбда-функции соединитесь с 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;
});
}
Кто-нибудь решает это?