나만의 인증 구축!

인증이란 무엇입니까?



인증은 사용자가 누구인지 확인하는 프로세스입니다. 요즈음 거의 모든 사람들이 "Google로 로그인"또는 "Facebook으로 로그인"등을 클릭하는 데 익숙해져 제2의 천성이 되었습니다. 대부분의 사람들은 Google 또는 Facebook 계정을 가지고 있으므로 사용자가 또 다른 지루한 계정 생성을 거치지 않아도 됩니다. 마찬가지로, 기본 계정을 만들기 위해 사용자가 필요로 하는 대부분의 서비스는 응용 프로그램에서 사용자를 인증하는 데 서비스를 사용할 때 해당 서비스에서 제공되기 때문에 최종 개발자가 더 쉽게 사용할 수 있습니다. 그러나 사용자가 이러한 타사 서비스 중 하나에 대한 계정을 가지고 있지 않으면 어떻게 됩니까? Google 또는 Facebook 계정이 없는 모든 최종 사용자가 해당 서비스에 가입하여 이제 귀하의 서비스를 사용하기를 기대하십니까? 그것은 최종 사용자로부터 많은 것을 기대하고 있습니다! 최근에 저는 귀하의 응용 프로그램에 대한 고유한 인증 서비스를 구축하는 다양한 방법을 조사했으며 원래 생각했던 것보다 설치가 조금 더 간단했습니다. 90년대에 처음 개발된 암호 해싱 패키지인 bcrypt라는 패키지를 사용하여 사용자 정보의 모의 데이터베이스를 매우 빠르게 구축할 수 있었습니다.

설정


  • 시작하려면 npm init 명령을 사용하여 프로젝트를 시작한 다음 npm i express bcrypt nodemon 필요한 종속 항목을 설치하는 기본 익스프레스 서비스를 만들었습니다.
  • 그런 다음 명령touch server.js을 사용하여 서버 파일을 만듭니다. server.js 상단에서 express 및 bcrypt를 가져옵니다.
  • 익스프레스 앱을 만들고 .json() 미들웨어를 사용하여 수신 json을 구문 분석합니다.
  • 모든 사용자 정보를 저장할 데이터베이스를 만듭니다. 여기에는 사용자 개체의 배열이 포함됩니다. 일반적으로 이 데이터를 보관하기 위해 mongo 또는 sql과 같은 일부 유형의 데이터베이스를 사용하지만 이 예제에서는 로컬users 배열을 사용합니다.

  • const port = 3000; // <--- run the app an any unused port
    const app = express(); // <--- create express app
    app.use(express.json()) // <--- middleware to parse incoming JSON
    app.listen(port, ()=>{
      console.log(`Server listening 👂 http://localhost:${port}`)
    })
    
    const users = []; // <--- fake local database
    


    어려운 부분이 완료되었습니다! 이제 마지막으로 package.json 파일에 서버를 실행하기 위한 스크립트가 있는지 확인하고 작업하는 동안 계속 실행해야 합니다!
    따라해 왔다면 package.json 파일에 "테스트"스크립트가 있어야 합니다. 해당 스크립트의 이름을 "start"로 변경하고 "nodemon server.js"값을 전달합니다.

    "scripts": {
        "start": "nodemon server.js"
      }
    


    터미널에서 npm start를 실행하여 스크립트를 테스트하십시오.

    이제 서버가 일부 정보를 적중하고 테스트할 수 있도록 몇 가지 엔드포인트를 구축하기만 하면 됩니다. 다음 함수를 데이터베이스 선언 아래의 server.js 파일에 붙여넣습니다.

    app.get('/', (req, res) => {
      res.status(200).send('Your server is working!');
    })
    
    app.get('/users', (req, res) => {
      if (users.length > 0) {
        res.status(200).send(users);
      } else {
        res.status(418).send('No users currently.')
      }
    })
    
    app.post('/users', async (req, res) => {
      try {
        const salt = await bcrypt.genSalt(); // <-- value can be incremented for more encryption.
        const hashedPassword = await bcrypt.hash(req.body.password, salt); // <--can be modified to take in # of 'rounds' instead of salt (default 10)
        console.log(salt);
        console.log(hashedPassword);
        const user = {
          name: req.body.name,
          password: hashedPassword,
          email: req.body.email
        }
        users.push(user);
        res.status(201).send(user);
      } catch {
        res.status(500).send();
      }
    })
    
    app.post('/users/login', async (req, res) => {
      const user = users.find( user => user.name = req.body.name );
      if (user === undefined) {
        return res.status(400).send('Username not found. Please check your credentials.')
      }
      try {
        if (await bcrypt.compare(req.body.password, user.password)) { //passwords match
          res.send('You\'ve successfully logged-in.');
        } else  { //passwords don't match
          res.send('Login failed, please check your credentials.');
        }; // <-- compare is secure to avoid 'timing attacks' bcrypt handles for you
      } catch {
        res.status(500).send();
      }
    


    이제 이러한 함수를 작성했으므로 적중할 수 있는 몇 가지 엔드포인트가 있습니다.
  • GET '/' 상태 200과 서버가 작동 중임을 알리는 메시지를 반환해야 합니다.
  • GET '/users' 상태 200과 전체 사용자 배열을 반환해야 합니다.
  • POST '/users' 이름, 암호 및 전자 메일 속성이 있는 사용자 개체를 가져와야 합니다. 이 끝점은 암호를 소금에 절이고 해시하고 사용자 배열에 사용자를 만들고 사용자 정보 + 소금에 절인/해시된 암호를 저장합니다.
  • POST '/users/login 이름, 암호 및 이메일 주소도 입력해야 합니다. 이 끝점은 먼저 이름이 데이터베이스에 있는지 확인한 다음, 존재하는 경우 제공된 암호가 사용자 데이터베이스에 저장된 해시 해제된 암호와 일치하는지 확인하려고 시도합니다. 이름이 데이터베이스에 없으면 상태 400과 사용자 이름이 존재하지 않는다는 메시지를 반환합니다. 성공적으로 비밀번호/사용자 이름이 일치하면 성공적으로 로그인했다는 메시지를 반환합니다. 비밀번호가 일치하지 않으면 로그인에 실패했다는 메시지가 표시됩니다.

  • 일부 해싱/시드 방법을 설명하는 데 도움이 되도록 코드 자체에 몇 가지 주석을 포함했습니다. 자세한 내용은 확인this link

    좋은 웹페이지 즐겨찾기