Node.js Koa 2 JWT 를 사용 하여 감 권 하 는 방법 예시

7242 단어 Koa2JWT감 권
머리말
앞 뒤 가 분 리 된 개발 에서 Restful API 를 통 해 데이터 상호작용 을 할 때 API 를 보호 하지 않 으 면 다른 사람 이 쉽게 이 API 를 가 져 와 호출 할 수 있다.그렇다면 서버 측은 어떻게 감 권 을 진행 해 야 합 니까?
Json Web Token 은 JWT 라 고 약칭 하 는데 간결 하고 자체 적 으로 포 함 된 통신 쌍방 간 에 JSON 대상 의 형식 으로 정 보 를 안전하게 전달 하 는 방법 을 정의 한다.JWT 는 HMAC 알고리즘 이나 RSA 의 공개 키 키 를 사용 하여 서명 할 수 있 습 니 다.
진짜 처럼 말 하 는데 도대체 어떻게 인증 을 해 야 하나 요?

먼저 사용자 가 로그 인 할 때 사용자 이름과 비밀 번 호 를 입력 한 후 서버 로그 인 인 인 터 페 이 스 를 요청 합 니 다.서버 에서 사용자 이름 비밀 번 호 를 확인 한 후 token 을 생 성하 고 전단 에 token 을 저장 하고 뒤의 요청 에서 token 을 요청 헤더 에 가지 고 서버 에 전송 합 니 다.서버 인증 token 이 유효 하고 정확 한 데 이 터 를 되 돌려 줍 니 다.
서버 측 에서 Koa 2 프레임 워 크 를 사용 하여 개발 한 이상 jsonwebtoken 라 이브 러 리 외 에 도 koa-jwt 미들웨어 를 사용 해 야 합 니 다.이 미들웨어 는 Koa 를 대상 으로 jsonwebtoken 을 패키지 하여 사용 하기에 더욱 편리 합 니 다.어떻게 사용 하 는 지 살 펴 보 자.
토 큰 생 성
로그 인 할 때 token 을 가 져 올 수 있 도록/login 루트 를 등 록 했 습 니 다.

const router = require('koa-router')();
const jwt = require('jsonwebtoken');
const userModel = require('../models/userModel.js');

router.post('/login', async (ctx) => {
  const data = ctx.request.body;
  if(!data.name || !data.password){
    return ctx.body = {
      code: '000002',
      data: null,
      msg: '     '
    }
  }
  const result = await userModel.findOne({
    name: data.name,
    password: data.password
  })
  if(result !== null){
    const token = jwt.sign({
      name: result.name,
      _id: result._id
    }, 'my_token', { expiresIn: '2h' });
    return ctx.body = {
      code: '000001',
      data: token,
      msg: '    '
    }
  }else{
    return ctx.body = {
      code: '000002',
      data: null,
      msg: '        '
    }
  }
});

module.exports = router;

사용자 이름 비밀번호 가 정확 한 지 검증 한 후에 jsonwebtoken 의 sign()방법 으로 token 을 만 들 고 세 개의 인 자 를 받 습 니 다.첫 번 째 는 부하 입 니 다.인 코딩 후 token 에 저 장 된 데이터 이자 token 을 검증 한 후에 얻 을 수 있 는 데이터 입 니 다.두 번 째 는 키 입 니 다.스스로 정의 하고 검증 할 때 도 같은 키 가 있어 야 디 코딩 할 수 있 습 니 다.세 번 째 는 options 입 니 다.token 의 만 료 시간 을 설정 할 수 있 습 니 다.
토 큰 가 져 오기
다음은 전단 에서 token 을 가 져 옵 니 다.vue.js 에서 axios 를 사용 하여 요청 합 니 다.요청 이 성공 한 후에 token 을 가 져 와 localstorage 에 저장 합 니 다.여기에 로그 인 에 성공 한 후 현재 시간 을 저장 합 니 다.token 이 존재 하 는 지 여 부 를 판단 하 는 것 외 에 현재 token 이 만 료 되 었 는 지 여 부 를 간단하게 판단 할 수 있 습 니 다.만 료 되면 로그 인 페이지 를 뛰 어 넘 을 수 있 습 니 다.

submit(){
  axios.post('/login', {
    name: this.username,
    password: this.password
  }).then(res => {
    if(res.code === '000001'){
      localStorage.setItem('token', res.data);
      localStorage.setItem('token_exp', new Date().getTime());
      this.$router.push('/');
    }else{
      alert(res.msg);
    }
  })
}
그리고 서버 쪽 API 를 요청 할 때 token 을 요청 헤더 에 가 져 와 서버 에 인증 합 니 다.요청 할 때마다 localstorage 의 token 을 가 져 옵 니 다.귀 찮 습 니 다.여 기 는 axios 요청 차단 기 를 사용 하여 요청 할 때마다 token 을 가 져 와 headers 에 넣 는 작업 을 했 습 니 다.

axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  config.headers.common['Authorization'] = 'Bearer ' + token;
  return config;
})
인증 토 큰
koa-jwt 미들웨어 를 통 해 검증 하고 용법 도 매우 간단 하 다.

const koa = require('koa');
const koajwt = require('koa-jwt');
const app = new koa();

//     
app.use((ctx, next) => {
  return next().catch((err) => {
    if(err.status === 401){
      ctx.status = 401;
      ctx.body = 'Protected resource, use Authorization header to get access
'; }else{ throw err; } }) }) app.use(koajwt({ secret: 'my_token' }).unless({ path: [/\/user\/login/] }));
app.use 를 통 해 이 중간 부품 을 호출 하고 키{secret:'mytoken'},unless 는 token 인증 이 필요 없 는 URL 을 지정 할 수 있 습 니 다.token 인증 이 실 패 했 을 때 401 오류 가 발생 하기 때문에 오류 처 리 를 추가 하고 app.use(koajwt)전에 두 어야 합 니 다.그렇지 않 으 면 실행 하지 않 습 니 다.
요청 할 때 token 이나 token 이 만 료 되 지 않 으 면 401 로 돌아 갑 니 다.
분석
우리 위 에 서 는 jsonwebtoken 의 sign()방법 으로 token 을 만 들 었 습 니 다.그러면 koa-jwt 는 무엇 을 했 는 지 우리 에 게 token 을 검증 해 주 었 습 니 다.

resolvers/auth-header.js
module.exports = function resolveAuthorizationHeader(ctx, opts) {
  if (!ctx.header || !ctx.header.authorization) {
    return;
  }
  const parts = ctx.header.authorization.split(' ');
  if (parts.length === 2) {
    const scheme = parts[0];
    const credentials = parts[1];
    if (/^Bearer$/i.test(scheme)) {
      return credentials;
    }
  }
  if (!opts.passthrough) {
    ctx.throw(401, 'Bad Authorization header format. Format is "Authorization: Bearer <token>"');
  }
};
auth-header.js 에서 요청 헤더 에 authorization 이 있 는 지 판단 하고 있 으 면 token 을 authorization 에서 분리 합 니 다.authorization 이 없 으 면 클 라 이언 트 가 token 을 서버 에 전송 하지 않 았 음 을 나타 내 며 401 오류 상 태 를 던 집 니 다.
verify.js

const jwt = require('jsonwebtoken');

module.exports = (...args) => {
  return new Promise((resolve, reject) => {
    jwt.verify(...args, (error, decoded) => {
      error ? reject(error) : resolve(decoded);
    });
  });
};

verify.js 에 서 는 jsonwebtoken 이 제공 하 는 verify()방법 으로 결 과 를 검증 합 니 다.jsonwebtoken 의 sign()방법 으로 token 을 만 들 고 verify()방법 은 token 을 인증 하고 해석 하 는 데 사 용 됩 니 다.token 이 잘못 되면 이 방법 이 검 증 됩 니 다.
index.js

const decodedToken = await verify(token, secret, opts);
if (isRevoked) {
  const tokenRevoked = await isRevoked(ctx, decodedToken, token);
  if (tokenRevoked) {
    throw new Error('Token revoked');
  }
}
ctx.state[key] = decodedToken; //    key = 'user'
if (tokenKey) {
  ctx.state[tokenKey] = token;
}
index.js 에서 verify.js 방법 을 사용 하여 token 을 검증 하고 해석 하여 위 에 sign()의 데이터{name:result.name,id: result._id},그리고 ctx.state.user 에 값 을 부여 합 니 다.컨트롤 러 에서 ctx.state.user 를 통 해 name 과 을 직접 받 을 수 있 습 니 다.id 。
안전성
  • JWT 의 암호 화 키 가 유출 되면 키 를 통 해 token 을 생 성하 고 API 를 임의로 요청 할 수 있 습 니 다.따라서 키 는 전단 코드 에 절대 존재 해 서 는 안 됩 니 다.그렇지 않 으 면 쉽게 찾 을 수 있 습 니 다
  • 4.567917.HTTP 요청 에서 token 은 header 에 놓 여 있 고 중간 자 는 패키지 도 구 를 통 해 header 의 데 이 터 를 쉽게 캡 처 할 수 있 습 니 다.한편,HTTPS 는 가방 을 잡 을 수 있 지만 암호 화 전송 이기 때문에 token 을 받 지 못 하면 상대 적 으로 안전 합 니 다총결산
    이 위 는 jwt 의 기본 적 인 절차 입 니 다.이것 은 아마도 가장 완벽 한 것 이 아 닐 것 입 니 다.그러나 대부분의 로그 인 에서 사용 하면 충분 합 니 다.
    위의 코드 가 구체 적 이지 않 을 수 있 습 니 다.여 기 는 Koa+mongoose+vue.js 를 사용 하여 실 현 된 예 입 니 다jwt-demo참고 할 수 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기