Есть простой и надежный способ получения ЭП для работы с налоговой, используя ваш смартфон и паспорт
Многие знают что для отправки заявлений на сайте налоговой нужна электронная квалифицированная подпись. Однако, с нею часто возникают сложности:
Есть простой и надежный способ получения ЭП для работы с налоговой, используя ваш смартфон и паспорт
Многие знают что для отправки заявлений на сайте налоговой нужна электронная квалифицированная подпись. Однако, с нею часто возникают сложности:
Решил поделиться с сообществом практическим пошаговым руководством для новичков о том, как быстро и дёшево собрать простой сайт с формой обратной связи для проверки гипотезы бизнеса любой возможной сферы, в которой привлечение клиентов ожидается через веб.
В последнее время всё чаще слышно о концепции No-Code: создание приложений и сайтов без…
Конечно, тут приведен минимальный пример, который нужно привести в порядок с помощью CSS, но он уже функциональный. С помощью библиотеки jquery можно проверить поля на предмет наличия текста и отправить данные вашему API.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Справитесь?
"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Размещение сайта в Internet"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Как было сказано выше, для статических сайтов размещение может быть бесплатным. Для этого воспользуемся бесплатной платформой для разработчиков https://github.com. Процесс регистрации на Github ничем не отличается от других сайтов. Я рекомендую сначала зарегистрироваться как пользователь под своей личной почтой и подтвердить её.
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"2f6767ae-411f-5a90-ad6a-2f86c4cd051d","width":1327,"height":897,"size":144405,"type":"jpg","color":"0d0f2b","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Затем, чтобы у вас появилась возможность привязывать бизнес домен к бесплатному хостингу сайта, нужно зарегистрировать аккаунт организации. Имя организации лучше выбрать совпадающее с доменом:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"464cbf0e-ad8e-5ad0-bfa9-3719d0c06c94","width":508,"height":257,"size":12215,"type":"jpg","color":"f2f9fa","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"После того как вы зарегистрировали организацию, нужно создать «репозиторий». Это хранилище, в которое вы загрузите все свои исходные файлы для сайта – HTML, CSS, картинки). На странице профиля вашей организации найдите самую яркую зелёную кнопку New, введите имя репозитория в формате (“.github.io” - это важно) и выберете флажок Public (это означает, что ваши исходники будут публично доступны). Да, Public размещение исходных файлов приложение может показаться минусом данного решения, ведь все смогут посмотреть, из чего состоит ваш сайт. Именно поэтому такое решение подходит для начальной стадии, когда сильно сложного или секретного ничего не происходит. В случае более серьезной разработки, за которую вы платите свои кровные деньги, будет логичным перенести всё в Private-репозиторий, но тогда потеряется возможность бесплатного хостинга.
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"2841bae4-cb44-56d5-8219-add655a00222","width":1193,"height":656,"size":120736,"type":"jpg","color":"f2f8f8","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"На странице созданного репозитория нажмите Add file -> Upload files. Загрузите исходники своего сайта, напишите комментарий и нажмите зелёную кнопку Commit Changes. Как только файлы сохранятся, вы сможете их увидеть на странице репозитория и тут же будет вся история изменений каждого файла (это статья не покрывает деталей работы с системами хранения и контроля версий кода и GIT в частности, но вы можете прочитать это в доступном руководстве).
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Как только файлы загрузились, зайдите в Settings -> Pages -> и включите публикацию ваших файлов через web server платформы, что сделает ваш сайт доступным всему интернету через домен https://mybusiness.github.io. Пример ниже:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"33978a4c-3fc6-592d-b393-827d6bbb4b23","width":1243,"height":751,"size":215203,"type":"jpg","color":"eff8f5","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"На этом можно остановиться, если вы делаете простейший сайт без формы обратной связи. Публикация такого сайта не требует вложения денег вообще.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Однако, нам нужно привязать доменное имя и почту организации. Следуя инструкциям нужно связать регистратора вашего домена (AWS Route 53) с платформой хостинга сайта (GitHub):
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"1. В настройках репозитория GitHub в поле Custom domain введите адрес вашего платного домена: mybusiness.com. Сохраните изменение (после этого в вашем репозитории появится файл CNAME, в котором это доменное имя прописано).
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"2. В соседней вкладке браузера откройте страницу «Консоли AWS» и поиском найдите сервис Route53
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"3. Перейдите на страницу своей зоны (Hosted Zone).
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"4. Нажмите “Create record” и создайте запись типа “CNAME” (выбирается из списка):
"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Выбираем Record type = CNAME","Record name = www","Value = mybusiness.github.io5. После этого подождите несколько, обычно до 24, часов, чтобы DNS записи прописались во всех маршрутизаторах на пути к AWS
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Через некоторое время ваш сайт станет доступным с URL https://www.mybusiness.com. А пока можно заняться подготовкой бек-енда.
"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Облачный бекенд"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Верифицируем домен для AWS SES"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"В цепочке отправки писем всегда есть Источник и Адресат. Адресатом в данном случае будет Email адрес, который вы уже сделали выше. Для отправки почты с помощью кода необходимо воспользоваться специальным сервисом AWS Simple Email Service, который будет являться Источником сообщений.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Первостепенным шагом является необходимость подтверждения того, что вы являетесь владельцем данного домена и имеете право отправлять почту от этого имени. Для подтверждения необходимо пройти процесс верификации вашего доменного имени и почтового адреса, с которого вы будете отправлять сообщения от сайта.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Переходите на сервис Amazon SES, Domains и нажимайте Verify a Domain Name, вводите домен своего сайта и следуйте инструкциям в верхней части формы (нижние нас пока не касаются):
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"1c5e2134-5f6e-58f6-add9-4ac295b8b709","width":869,"height":603,"size":67555,"type":"jpg","color":"eaeeef","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"1. В соседней вкладке браузера откройте сервис Route53, в котором перейдите на свою зону, как уже делали ранее.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"2. Жмём “Create record” и создаём запись типа “TXT”:
"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Выбираем Record type = TXT","Record name = … значение поля Name выданное выше…","Value = … значение поля Value выданное выше…3. Сохраните изменения.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Наличие этих значений, привязанных к вашему домену, будет говорить SES о том, что вы полностью его контролируете, а значит, можете отправлять туда и обратно письма.
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"c49397d4-39be-52e7-b720-1a76a2425307","width":1262,"height":271,"size":52766,"type":"jpg","color":"e2e4e4","hash":"","external_service":[]}}}]}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Создаём логику отправки сообщений"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Сначала нужно разрешить коду, исполняемому в облаке, отправку сообщений. Для этого надо создать так называемые IAM-разрешения (Оригинальные инструкции):
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"1. В соседней вкладке браузера откройте сервис IAM (найдите его поиском, это удобно), и перейдите на страницу Policies.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"2. Жмите “Create policy”
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"3. Выберите вкладку JSON
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"4. Вставьте в поле код нашего разрешения, приведённый ниже:
"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Action\": [\n \"ses:SendEmail\",\n \"ses:SendRawEmail\",\n \"logs:CreateLogGroup\",\n \"logs:CreateLogStream\",\n \"logs:PutLogEvents\"\n ],\n \"Resource\": \"*\"\n }\n ]\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"5. Дайте имя вроде MyBusinessEmailSender
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"6. Сохраните изменения.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Теперь нужно создать роль и соединить её с разрешением.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"7. Перейдите на страницу Roles и жмите “Create Role”
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"8. Выберите сервис Lambda
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"9. Далее, выбирайте из списка ваше разрашение MyBusinessEmailSender
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"10. Дайте Роли имя вроде MyBusinessEmailSenderRole
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"11. Сохраните изменения.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Таким образом, вы создали разрешение и роль. Они дают возможность отправлять Email, а так же логгировать события отправки для отладки. В официальной документации можно также найти примеры других разрешений IAM для SES.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Теперь самое время создать бессерверную функцию, которая будет просыпаться в момент прихода сообщения и слать его к вам на почту используя AWS SES.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"1. В соседней вкладке браузера откройте сервис Lambda, в котором перейдите на страницу Functions
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"2. Введите имя функции, пусть будет “MyBusinessEmailSendFunction”.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"3. На странице Permissions под Execution role, подтвердите, что созданная ранее роль назначена вашей функции
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"4. Под Function code в редакторе editor pane, вставьте нижеследующий JavaScript код функции, представленный ниже, сначала заменив в одной из верхних строк код региона us-west-2 на код вашего региона выбранного в «Консоли AWS». Его можно найти в пункте меню справа сверху.
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"9475d2a5-ae36-5212-8745-2eee5c9f230d","width":293,"height":445,"size":36232,"type":"jpg","color":"252e3d","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"5. Нажмите кнопку Deploy, чтобы сохранить функцию.
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"В коде функции мы используем возможности библиотеки разработки AWS SDK, которую вам следует изучить детальнее, если вы планируете расширять функционал.
"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nvar aws = require(\"aws-sdk\");\nvar ses = new aws.SES({ region: \"us-east-1\" });\n\nexports.handler = (event, context, callback) => {\n const querystring = require('querystring');\n\n var parsedBody = querystring.parse(event.body);\n \n var params = {\n Destination: {\n ToAddresses: [\"hello@mysuperbusiness.com\"],\n },\n Message: {\n Body: {\n Text: { Data: \"Source email: \" + parsedBody.contactemail + \"\\r\\n\" + parsedBody.messagetext },\n },\n\n Subject: { Data: \"Email from \" + parsedBody.fullname },\n },\n Source: \"hello@mysuperbusiness.com\",\n };\n \n ses.sendEmail(params).promise();\n\n var response = {\n \"statusCode\": 200,\n \"headers\": {\n \"Access-Control-Allow-Headers\" : \"Content-Type\",\n \"Access-Control-Allow-Origin\": \"https://mysuperbusiness.com\",\n \"Access-Control-Allow-Methods\": \"OPTIONS,POST,GET\"\n },\n \"body\": \"{ Success: 'Email sent' }\",\n \"isBase64Encoded\": false\n };\n callback(null, response);\n};","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Такие функции работают на основе событий. События приходят, они их обрабатывают, отправляя либо ответ, либо создавая новые события следующим функциям или сервисам (как в нашем случае). Теперь давайте проверим, работает ли функция:
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"1. На странице вашей функции найдите вкладку Test
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"2. Выберите New event
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"3. Дайте имя вашему тесту, чтобы можно было его повторять
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"4. Введите данные теста в виде следующего JSON:
"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"{\n \"Body\": \"subject=test%test.com&messagetext=This%20is%20my%20test%20message%20from%20some%20client \"\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"5. Нажмите Test
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"6. Проверьте получение почты
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"В инструкции вы найдёте больше деталей о том как настроить тестовое событие.
"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Добавляем публичный API адрес через AWS API Gateway"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Теперь необходимо дать возможность коду, внешнему к вашему облаку, и развёрнутому где-то на серверах Git Hub, достучаться до вашей функции отправки сообщений. Для этого нам понадобится так называемое публичное API. Для этого мы воспользуемся ещё одним сервисом AWS API Gateway:
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"1. В «консоли AWS» на странице сервиса Lambda нажмите кнопку Add trigger
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"2a78fa00-2c2d-519b-8c63-bb6838f34fda","width":546,"height":476,"size":37765,"type":"jpg","color":"2c3c4a","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"2. Выберите API Gateway и в ниспадающем списке Add API
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"f15a5649-c948-5df6-bba1-d4b1bbeff511","width":932,"height":597,"size":70210,"type":"jpg","color":"f3f4f4","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"3. Выберите тип REST API и дайте имя вроде MyBusinessEmailApi
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"70282bf9-522c-5539-8bd7-f6c4713bb564","width":834,"height":602,"size":138667,"type":"jpg","color":"eef1f1","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"4. На странице Resources выбирайте из списка Actions пункт \"Create Resource\"
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"5. Назовите новый ресурс “send-email” и обязательно выберите галочку “Enable CORS”
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"6. Выделив только что созданный ресурс выберите из списка Actions пункт \"Create Method\" типа POST
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"c7164c5b-7bc1-54b3-a7fc-5cfa52b70d34","width":816,"height":442,"size":112362,"type":"jpg","color":"282f3b","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"7. Теперь нужно связать этот API с функцией, которая будет исполняться. Введите имя своей функции, созданной выше:
"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"8697ee97-d383-5a78-8ed4-a81288a7e403","width":887,"height":384,"size":36069,"type":"jpg","color":"36383b","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"8. В результате, у вас должен появиться REST API с двумя методами: POST (для отправки сообщений) и OPTIONS (это метод, используемый браузерами для проверки безопасности).
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"9. Осталось сделать его доступным, выбрав из списка Actions пункт Deploy API
"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"10. После успешного развёртывания система покажет вам ссылку, по которой можно вызвать ваш метод, сохраните её себе.
"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Связываем контактную форму с API"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"Осталось пойти в репозиторий с кодом на GitHub и отредактировать файл HTML формы, подставив в коде JavaScript правильный URL адрес в атрибут “action” вашей HTML формы:
"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"