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