Проверка соответствия имени пользователя из внешнего API во время процесса регистрации

#javascript #jquery #node.js #express #basic-authentication

#javascript #jquery #node.js #экспресс #basic-аутентификация

Вопрос:

Я создаю веб-приложение, которое позволяет игрокам Fortnite находить других игроков для игры. Пользователи должны иметь возможность регистрироваться, входить в систему, публиковать и комментировать. Я разработал интерфейсную часть функций входа и регистрации пользователя, а также серверную часть регистрации пользователя, но одно из моих требований заключается в том, что:

Перед регистрацией сервер должен проверить, является ли указанное имя пользователя реальным именем пользователя Fortnite, используя FortniteTracker API, который предоставляет профили пользователей с использованием их очень простого API.

Пример вызова: GET https://api.fortnitetracker.com/v1/profile /{платформа}/{эпический ник}

Как мне проверить, что имя пользователя существует, прежде чем разрешить пользователю создать учетную запись?

Я попытался создать отдельную конечную точку для вызова API со стороны сервера, но я не знал, как реализовать ее в моей конечной точке / register

script.js

 function registerRequest(username,password) {
  $.ajax({
    url: "http://localhost:8080/register",
    type: 'POST',
    data: JSON.stringify({username,password}),
    contentType: "application/json",
    error : function(err) {
      console.log('Error here!', err)
    },
    success: function(data) {
      console.log('Success!')
      // What do I put here?
    }
  });
}


function handleRegisterSubmit(event) {
  event.preventDefault();
  const username = $(event.currentTarget).find('.username-register').val()
  const password = $(event.currentTarget).find('.password-register').val()
  const passwordConfirm = $(event.currentTarget).find('.password-confirm').val()

  if (password === passwordConfirm) {
    registerRequest(username,password)
  }
  else {
    console.error("Passwords did not match")
  }

}

$(function onLoad() {
    displayRegisterPage()
    $(`.js-content-section`).on('submit', '.js-register-form', handleRegisterSubmit)
  }

})
  

server.js

 app.post('/register', jsonParser, (req, res) => {
  const requiredFields = ['username', 'password']
  for (let i = 0; i < requiredFields.length; i  ) {
    const field = requiredFields[i]
    if (!(field in req.body)) {
      const message =  `Missing `${field}` in request body`
      console.error(message)
      return res.status(400).send(message)
    }
  }
  let username = req.body.username;
  let password = req.body.password;
  User.findOne({username})
  .then(user => {
    if (user) {
      const message = `username is already taken`
      console.error(message)
      return res.status(400).send(message)
    }
    else {
      User.create({username, password})
      .then(user => {
        const userRes = {
          id: user._id,
          username: user.username
        }

        res.status(201).json(userRes)
      }
      )
    }
  })
  .catch(err => {
    console.error(err)
    res.status(500).json({ error: 'something went horribly wrong'})
  })

})

app.get('/login', (req, res) => {
  const usernameReq = User.findById(req.body.username);
  if (usernameReq) {
    console.log(usernameReq)
    res.status(201).json(usernameReq)
  }
})
  

schema.js

 const UserSchema = new mongoose.Schema({
  username: {
    type: String,
    unique: true,
    required: true,
    trim: true
  },
  password: {
    type: String,
    required: true,
  }
});


const User = mongoose.model('User', UserSchema);
module.exports = User;
  

Я ожидаю, что если я зарегистрируюсь с помощью «ninja» в качестве имени пользователя, я смогу зарегистрироваться, поскольку это действительное имя пользователя Fortnite. Фактический результат в настоящее время позволяет пользователям регистрироваться с любым именем пользователя, которого еще нет в базе данных.

Комментарии:

1. В чем, по-видимому, проблема? Вы можете легко добавить код для выполнения вызова API API tracker из обработчика вашего register API и, если он действителен, продолжить регистрацию, иначе отправьте ответ, в котором говорится, что это недопустимое имя пользователя.

2. как мне это сделать? Я не уверен, куда его поместить

3. сразу после выполнения базовой проверки полей и перед регистрацией в базе данных с помощью User.findOne()

Ответ №1:

axios Для выполнения внешнего вызова api вам понадобятся пакеты, такие как , request , request-promise ( Promise поддерживаемая версия request ) и т.д. Вы можете попробовать реализовать register подобное.

 const rp = require('request-promise');

app.post('/register', jsonParser, async (req, res) => {
  ...
  let username = req.body.username;
  let password = req.body.password;

  const options = {
    method : 'GET',
    uri: 'https://api.fortnitetracker.com/v1/profile/{platform}/{epic-nickname}',
    resolveWithFullResponse: true
  }
  const data = await rp(options)
  // check if response code is 200 and check for the expected body
  ...
  // continue rest of the code
}
  

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

 async function checkUser (req, res, next) {
  const options = {
    method : 'GET',
    uri: 'https://api.fortnitetracker.com/v1/profile/{platform}/{epic-nickname}',
    resolveWithFullResponse: true
  }
  const data = await rp(options)
  // check if response code is 200 and check for the expected body
  if (checks ok)
    // if all check ok go to next middleware
    next()
  else
    // if checks did not succeed
    // you could pass error to error handler like next(new Error("Hey you do not exist"))
    // or render something here
}
  

Затем смонтируйте его следующим образом:

 app.post('/register', jsonParser, checkUser, (req, res) {
  ...
  

Ответ №2:

Вы можете сделать это, просто отправив имя пользователя в API https://api.fortnitetracker.com/v1/profile /{платформа}/{эпический ник}

Он выдаст вам ответ с упоминанием о том, существует пользователь или нет. На основе ответа вы можете сделать другой запрос AJAX для регистрации пользователя, только если пользователь не существует.

Ответ №3:

Я использую запрос обещания для разрешения, отклонения, когда кто-то вводит свое имя пользователя. Он вызывается только onClick . в вашем запросе вы сможете определить, был ли вызов успешным или нет с именем пользователя.