Спасибо, что последовали за мной в этом небольшом путешествии по реализации функций входа в систему с помощью React-Native. Я надеюсь, что это будет последний урок из серии, и он не слишком затянется. Поэтому в этом уроке я сосредоточусь на конечной точке входа в API, а также на тестировании этой конечной точки в postman.

Хорошо, мы начнем с того, что снова откроем наш API и создадим новую конечную точку «POST» с именем «signin» с функцией обратного вызова.

app.post('/signin',function(req,res){
});

Я снова создам 2 переменные в этой конечной точке электронной почты и пароля, которые будут переданы в API через тело запроса из нашего приложения.

var email = req.body.email;
var password = req.body.password;

Затем я получу соединение из пула, выполню регулярные проверки ошибок, как мы делали в предыдущих статьях, и использую эти переменные, чтобы сначала увидеть, существует ли учетная запись с введенным адресом электронной почты, используя ключевое слово «запрос», чтобы содержать SQL I хочу использовать, и если есть результат, возвращенный из моего обратного вызова «запрос», я буду продолжать и получать пароль и идентификатор пользователя из пользовательской таблицы, используя другой «запрос». Кроме того, я буду использовать bcrypt для сравнения введенного пароля с сохраненным, и если они оба одинаковы (bcrypt делает некоторые интеллектуальные вещи, поскольку он знает, когда соленый пароль совпадает с паролем, введенным в виде обычного текста), тогда я буду использовать package «jwt», чтобы подписать уникальный JWT с идентификатором пользователя и отправить его обратно в приложение.

Пока это то, что у меня есть для моей конечной точки входа.

app.post('/signin',function(req,res){
var email = req.body.email;
var password = req.body.password;
myPool.getConnection(function(err,myConnection){
if(err){
res.send({
message:'Error retrieving connection: ' + myConnection
})
}else{
myConnection.query('SELECT COUNT(*) AS EmailCount FROM user WHERE email = ?',[email],function(err,emailCountResults,emailCountFields){
if(err){
res.send({
message:'Error selecting count: ' + err
})
}else{
}
})
}
})
});

В пустом операторе else мы создадим переменную, равную столбцу «EmailCount», выбранному из предыдущего запроса, если это 1, то мы начнем делать другой запрос, чтобы выбрать идентификатор пользователя и пароль, иначе мы ответим сообщением « Нет учетной записи, связанной с этим адресом электронной почты».

var emailCount = emailCountResults[0].EmailCount;
if(emailCount===1){
myConnection.query('SELECT UserID,password FROM user WHERE email = ?',[email],function(err,idPassResults,idPassFields){
if(err){
res.send({
message:'Error selecting user info: ' + err
});
}else{
}
})
}else{
res.send({
message:'No account associated with that email'
});
}

Итак, теперь мой оператор else выглядит так, как показано выше, где, если электронная почта присутствует в базе данных, мы выбираем идентификатор пользователя и пароль.

Затем мы устанавливаем полученный идентификатор пользователя и пароль равными переменным.

После этого мы используем встроенный в bcrypt метод «сравнить», который сравнивает простой текстовый пароль, переданный в ПЕРВЫЙ параметр, с паролем из базы данных в параметре ВТОРОЙ, затем используется обещание сделать что-то, что содержит один аргумент «результат». Если «результат» верен, это означает, что пароли одинаковы, и мы можем продолжить, иначе был введен неверный пароль.

let userPassword = idPassResults[0].password;
let userID = idPassResults[0].UserID;
bcrypt.compare(req.body.password,userPassword)
.then((result)=>{
if(result){
//if the passwords are the same
}
})

Если пароли совпадают, мы начинаем процесс ответа пользователю с помощью JWT.

Мы сделаем это с помощью пакета «jsonwebtoken» и метода «sign».

Однако есть еще один шаг, который мы должны сделать, нам нужно передать секретный ключ с нашим JWT.

Теперь перейдите по ссылке ниже.

https://www.grc.com/passwords.htm

Перейдя по этой ссылке, вы сгенерируете несколько безопасных паролей, которые отобразятся на экране. Скопируйте значения под «64 случайных шестнадцатеричных символа (0–9 и AF):» и перейдите в раздел «config vars», который можно найти в «настройках» в Heroku, и создайте config var. с ключом «SECRETKEY» в вашем коде вы будете ссылаться на эту переменную конфигурации, используя «process.env.SECRETKEY».

После того, как вы сохранили это, убедитесь, что ваш код внутри последней версии else похож на приведенный ниже. Хотя некоторые имена переменных/столбцов могут отличаться.

let userPassword = idPassResults[0].Password;
let userID = idPassResults[0].UserID;
bcrypt.compare(req.body.password,userPassword)
.then((result)=>{
if(result){
//if the passwords are the same
const token = jwt.sign({userID: userID }, process.env.SECRETKEY, {
expiresIn: '1h'
});
}
})

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

let userPassword = idPassResults[0].password;
let userID = idPassResults[0].UserID;
bcrypt.compare(req.body.password, userPassword)
.then((result) => {
if (result) {
//if the passwords are the same
const token = jwt.sign({ userID: userID }, process.env.SECRETKEY, {
expiresIn: '1h'
});
res.status(200).send({ token: token });
}else{
res.sendStatus(401).send({ token: token });
}
})

Примечание

ПОЖАЛУЙСТА, ПРОЧТИТЕ ЭТО. Может возникнуть одна проблема, с которой вы столкнетесь, когда начнете тестировать это после того, как вы git add, commit и push, и это может быть то, что когда вы тестируете конечную точку «signin» на postman, она всегда будет возвращать false для «bcrypt .compare», возможно, вам придется вернуться к столбцу пароля в вашей базе данных и изменить его длину, поскольку я установил для себя значение 45 символов, и оно было обрезано при выборе пароля из базы данных для сравнения. Я изменил свой на VARCHAR(500), и мой вход теперь работает нормально! Просто подумал, что скажу.

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

Вуаля!

Итак, мы идем, я использовал конечную точку «вход», используя правильный адрес электронной почты и пароль, и он вернул токен.

При этом, если я ввожу неправильный пароль, я получаю ответ неавторизованным.

Спасибо, что дочитали до конца, если есть что-то, что я пропустил, пожалуйста, дайте мне знать, и я внесу соответствующие поправки в статью, надеюсь, вы узнали что-то из этого, и не забудьте также поделиться статьей / лайкнуть ее!

Загляните в мой блог - https://cowboycode.co.uk/