Проверка соответствия имени пользователя извне API в процессе регистрации - PullRequest
0 голосов
/ 12 апреля 2019

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

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

Пример вызова: GET https://api.fortnitetracker.com/v1/profile/{platform}/{epic-nickname}

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

Я пытался создать отдельную конечную точку для вызова 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. Фактический вывод в настоящее время позволяет пользователям регистрироваться под любым именем пользователя, которое еще не занято в базе данных.

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Вам понадобятся пакеты типа axios, request, request-promise (Promise поддерживаемая версия request) и т. Д. Для выполнения внешнего вызова API. Вы можете попробовать реализовать в 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) {
  ...
0 голосов
/ 05 июня 2019

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

0 голосов
/ 12 апреля 2019

Вы можете сделать это, просто отправив имя пользователя в API https://api.fortnitetracker.com/v1/profile/{platform}/{epic-nickname}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...