Попытка создать Express API серверной части электронной почты с аутентификацией - PullRequest
0 голосов
/ 17 июня 2020

Итак, у меня есть идея для внутреннего сервера API электронной почты с аутентификацией. Прямо сейчас я сосредотачиваюсь только на его части аутентификации, и это то, в чем мне нужна помощь с конкретизацией:

const express = require('express');
const bodyParser = require('body-parser');
const expressSession = require("express-session");

const app = express();
app.use(bodyParser.json());
app.use(expressSession(session));

const handleAuth = (req, res, next) => {
if (!req.session.user_id) {
    res.status(200).send({ "authenticated": false, "username": null });
  } else {
    res.status(200).send({ "authenticated": true, "username": req.session.user_id });
  }
}

Тело этого первого маршрутизатора ниже будет иметь username: String, password: String и passwordConfirmation: String. Итак, моя цель здесь - в конечном итоге разработать интерфейсное приложение, которое будет отправлять почтовый запрос по этому пути с телом, содержащим username, password и passwordConfirmation, которое будет регистрировать пользователя для новой учетной записи.

app.post('/auth/signup', (req, res) => {
  // Signs up for a new account with the
  // provided username
  res.status(422).send({ username: "Username already in use" });
  res.status(422).send({ username: "Username already in use", 
     password: "Must be between 4 and 20 characters", 
     passwordConfirmation: "Passwords must match" });
});

Тело второго маршрутизатора ниже будет иметь username: String и password: String.

app.post('/auth/signin', (req, res) => {
  // Signs in with the provided username
});

Тело этого третьего маршрутизатора ниже будет иметь username: String.

app.post('/auth/username', (req, res) => {
  // Checks to see if a username is 
  // already in use
});

Четвертый маршрутизатор не будет иметь тела.

app.get('/auth/signedin', handleAuth, (req, res) => {
  // Checks to see if the user is currently 
  // signed in
});

Пятый маршрутизатор будет иметь пустой объект {}.

app.post('/auth/signout', (req, res) => {
  // Signs the user out
  res.status(200).send({}); 
});

Не только logi c, но независимо от того, с чем кто-либо может помочь, например, я хочу использовать Redis, но не уверен, как он вписывается в это, за исключением того, что это хранилище данных в памяти, которое также может сохранять электронные письма, с которыми пользователи подписываются. для проверки наличия username.

1 Ответ

0 голосов
/ 17 июня 2020

Пакет express -session https://www.npmjs.com/package/express-session может быть вам полезен.

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

req.session.user = req.body.username

В маршруте входа вы просто проверяете, существует ли пользователь, и снова сохраняете зарегистрированного пользователя.

req.session.user = req.body.username

В вашем маршрут выхода из системы, вам просто нужно удалить пользователя сеанса

req.session.user = undefined

Чтобы проверить, вошел ли пользователь в систему или нет, вы можете использовать express Router

var routerLogged = express.Router();
routerLogged .use(function (req, res, next) {
    if (req.session.user) {
        //user logged in, everything ok
        next();
    } else {
       //user not logged in
        res.redirect("/auth/signin");
    }
});

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

app.use("/user/personalData", routerLogged);
app.use("/whatever", routerLogged);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...