C помощью кода JS и запросов RequestJS мы можем создать функционал кастомной формы, в которой действие будет подтверждаться по Email или SMS.
Код JS на странице:
$(function(){
$(document).delegate('.ae-sendCode', 'click', function(e){
e.preventDefault();
var contact = $('.ae-contact').val();
if(!contact) {
$('.ae-contact').focus();
return;
}
// запрашиваем код для юзера
as.sys.request("auth", "sendCode", {
data: { contact:contact },
onSuccess: function (data) {
if (data.result && data.data && data.data.length) {
console.log(data.data);
var s = '';
as.sys.showDialog("Введите код", s, "OK", function () {
var code = $('.ae-code').val();
if(!code) {
$('.ae-code').focus();
return;
}
// проверяем код и выполняем целевое действие
as.sys.request("auth", "verifyCode", {
data: { contact:contact, code: code },
onSuccess: function (data) {
if (data.result && data.data && data.data.length) {
location.href='/';
}else{
as.sys.bootstrapAlert(data.msg || "Неверный код, либо пользователь заблокирован", {type: "warning"});
}
}
});
});
}else {
as.sys.bootstrapAlert(data.msg || "Что-то пошло не так. Проверьте указанный контакт.", {type: "warning"})
}
}
});
});
});
Код первой процедуры SQL (отправка кода пользователю на email через внешнее действие):
CREATE OR ALTER PROCEDURE [dbo].[request_auth_sendCode]
@parameters DictionaryParameter READONLY, -- or ExtendedDictionaryParameter
@username nvarchar(32)
AS
BEGIN
declare @code nvarchar(32) = upper(left(convert(nvarchar(36), newid()), 5)) -- 'xxx12'
declare @contact nvarchar(128)
select @contact = Value from @parameters where [Key]='contact'
declare @userID int, @email nvarchar(128)
select @userID = id, @email = email from as_users where lower(email)=lower(@contact)
if(@userID is null) begin
select 'Не найден указанный email' Msg, 0 Result
return
end
update as_users set sessionCode=@code, sessionCodeCreated = getdate()
where id = @userID
-- SELECT 1 Msg, Result
select '' Msg, 1 Result
-- SELECT 2 Основные данные в виде произвольной таблицы
select 1 tst
-- SELECT 3 Внешние действия
declare @body nvarchar(max) = 'Код для ввода на сайте - ' + @code
select 'email' type, @email [to], 'Подтверждение действия' subject, @body body
END
Вторая процедура SQL (проверка кода и выполнение целевого действия):
CREATE OR ALTER PROCEDURE [dbo].[request_auth_verifyCode]
@parameters DictionaryParameter READONLY, -- or ExtendedDictionaryParameter
@username nvarchar(32)
AS
BEGIN
declare @contact nvarchar(128)
select @contact = Value from @parameters where [Key]='contact'
declare @code nvarchar(128)
select @code = Value from @parameters where [Key]='code'
declare @userID int,@date datetime , @user nvarchar(128)
select @userID = id, @date = sessionCodeCreated, @user = username from as_users where lower(email)=lower(@contact) and lower(sessionCode)=lower(@code)
if(@userID is null) begin
select 'Неверный код' Msg, 0 Result
return
end
if(datediff(minute, getdate(), @date) > 20) begin
select 'Истекло время ожидания. Попробуйте заново отправить код' Msg, 0 Result
return
end
-- SELECT 1 Msg, Result
select '' Msg, 1 Result
-- SELECT 2 Основные данные в виде произвольной таблицы
select 1 tst
-- SELECT 3 Внешние действия
--- если все ОК - то выполняем целевое действие ....
END
Примечание: