Node.js Koa 2 JWT 를 사용 하여 감 권 하 는 방법 예시
앞 뒤 가 분 리 된 개발 에서 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 의 기본 적 인 절차 입 니 다.이것 은 아마도 가장 완벽 한 것 이 아 닐 것 입 니 다.그러나 대부분의 로그 인 에서 사용 하면 충분 합 니 다.
위의 코드 가 구체 적 이지 않 을 수 있 습 니 다.여 기 는 Koa+mongoose+vue.js 를 사용 하여 실 현 된 예 입 니 다jwt-demo참고 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Node.js Koa 2 JWT 를 사용 하여 감 권 하 는 방법 예시다음은 전단 에서 token 을 가 져 옵 니 다.vue.js 에서 axios 를 사용 하여 요청 합 니 다.요청 이 성공 한 후에 token 을 가 져 와 localstorage 에 저장 합 니 다.여기에 로그 인...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.