노드는 토큰 기반 인증을 구현합니다.
이 글은 주로 토큰 기반 인증을 구현하는 노드를 소개합니다. 이제 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.
저는 최근에 토큰 기반 인증을 연구하여 이 메커니즘을 개인 프로젝트에 통합했습니다. 요즘 많은 웹사이트의 인증 방식은 전통적인 시션+쿠키에서 토큰 인증으로 전환되었습니다. 기존 검증 방법에 비해 토큰은 확장성과 보안이 더 좋습니다.
기존 세션+쿠키 인증
HTTP는 상태 비저장이므로 사용자의 신원을 기록하지 않습니다. 사용자가 계정과 비밀번호를 서버에 보낸 후 백그라운드에서 확인을 통과하지만 상태가 기록되지 않으므로 다음 사용자의 요청에서는 여전히 신원 확인이 필요합니다. 이 문제를 해결하기 위해서는 서버 측에서 사용자의 신원이 포함된 기록, 즉 세션을 생성한 후 이 기록을 사용자에게 전송하고 이를 사용자의 로컬 영역, 즉 쿠키에 로컬로 저장해야 합니다. . 다음으로, 사용자의 요청이 이 쿠키를 가져옵니다. 클라이언트의 쿠키와 서버의 세션이 일치할 수 있으면 사용자의 신원 인증이 통과되었음을 의미합니다.
토큰 신원 확인
프로세스는 대략 다음과 같습니다.
첫 번째 요청 시 사용자는 계정과 비밀번호를 보냅니다.
백그라운드 확인이 통과되면 시간 유효 토큰이 생성된 후 이 토큰이 사용자에게 전송됩니다.
사용자가 토큰을 얻은 후 토큰은 일반적으로 localstorage 또는 쿠키에 로컬로 저장됩니다.
각 후속 요청은 이 토큰을 요청 헤더에 추가합니다. 모든 것을 확인해야 합니다. 모든 ID 인터페이스는 토큰으로 확인됩니다. 토큰으로 구문 분석된 데이터에 사용자 ID 정보가 포함되어 있으면 ID 확인이 통과됩니다.
기존 인증 방법과 비교하여 토큰 인증은 다음과 같은 장점이 있습니다.
토큰 기반 인증에서는 세션이나 쿠키에 인증 정보를 저장하는 대신 요청 헤더를 통해 토큰을 전송합니다. 이는 무국적을 의미합니다. HTTP 요청을 보낼 수 있는 모든 터미널에서 서버에 요청을 보낼 수 있습니다.
CSRF 공격을 피할 수 있습니다
응용 프로그램에서 세션을 읽거나 쓰거나 삭제할 때 적어도 처음으로 운영 체제의 임시 폴더에서 파일 작업이 발생합니다. 여러 서버가 있고 첫 번째 서비스에서 세션이 생성되었다고 가정합니다. 요청을 다시 보내고 해당 요청이 다른 서버에 도달하면 세션 정보가 존재하지 않고 "인증되지 않음" 응답을 받게 됩니다. 알아요. 고정 세션을 사용하면 이 문제를 해결할 수 있습니다. 하지만 토큰 기반 인증에서는 이 문제가 자연스럽게 해결됩니다. 서버로 전송되는 모든 요청에서 요청 토큰이 가로채기 때문에 고정 세션 문제가 없습니다.
다음은 node+jwt(jwt 튜토리얼)를 사용하여 간단한 토큰 신원 확인을 구축하는 방법을 소개합니다
Example
사용자가 처음 로그인할 때 계정과 비밀번호를 서버에 제출합니다. , 서버 검증이 통과되면 해당 토큰을 생성합니다. 코드는 다음과 같습니다.
const fs = require('fs'); const path = require('path'); const jwt = require('jsonwebtoken'); //生成token的方法 function generateToken(data){ let created = Math.floor(Date.now() / 1000); let cert = fs.readFileSync(path.join(__dirname, '../config/pri.pem'));//私钥 let token = jwt.sign({ data, exp: created + 3600 * 24 }, cert, {algorithm: 'RS256'}); return token; } //登录接口 router.post('/oa/login', async (ctx, next) => { let data = ctx.request.body; let {name, password} = data; let sql = 'SELECT uid FROM t_user WHERE name=? and password=? and is_delete=0', value = [name, md5(password)]; await db.query(sql, value).then(res => { if (res && res.length > 0) { let val = res[0]; let uid = val['uid']; let token = generateToken({uid}); ctx.body = { ...Tips[0], data: {token} } } else { ctx.body = Tips[1006]; } }).catch(e => { ctx.body = Tips[1002]; }); });
사용자는 검증을 통해 획득한 토큰을 로컬에 저장합니다.
store.set('loginedtoken',token);//store为插件
클라이언트가 인터페이스를 요청한 후 신원 확인이 필요하면 토큰이 배치됩니다. 요청 헤더가 서버에 전달됩니다:
service.interceptors.request.use(config => { let params = config.params || {}; let loginedtoken = store.get('loginedtoken'); let time = Date.now(); let {headers} = config; headers = {...headers,loginedtoken}; params = {...params,_:time}; config = {...config,params,headers}; return config; }, error => { Promise.reject(error); })
서버는 토큰을 가로채고 로그인이 필요한 모든 인터페이스의 유효성을 확인합니다.
function verifyToken(token){ let cert = fs.readFileSync(path.join(__dirname, '../config/pub.pem'));//公钥 try{ let result = jwt.verify(token, cert, {algorithms: ['RS256']}) || {}; let {exp = 0} = result,current = Math.floor(Date.now()/1000); if(current <= exp){ res = result.data || {}; } }catch(e){ } return res; } app.use(async(ctx, next) => { let {url = ''} = ctx; if(url.indexOf('/user/') > -1){//需要校验登录态 let header = ctx.request.header; let {loginedtoken} = header; if (loginedtoken) { let result = verifyToken(loginedtoken); let {uid} = result; if(uid){ ctx.state = {uid}; await next(); }else{ return ctx.body = Tips[1005]; } } else { return ctx.body = Tips[1005]; } }else{ await next(); } });
이 예제에 사용된 공개 키와 개인 키는 직접 생성할 수 있습니다. 작업은 다음과 같습니다.
명령줄 도구를 열고 openssl을 열고
생성합니다. 개인 키: genrsa -out rsa_private_key .pem 2048
공개 키 생성: rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
노드 백엔드 코드를 보려면 여기를 클릭하세요
여기를 클릭하세요 프런트 엔드 코드 보기
관련 권장 사항:
위 내용은 노드는 토큰 기반 인증을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

유효하지 않은 로그인 토큰에 대한 해결 방법에는 토큰 만료 여부 확인, 토큰이 올바른지 확인, 토큰 변조 여부 확인, 토큰이 사용자와 일치하는지 확인, 캐시 또는 쿠키 지우기, 네트워크 연결 및 서버 상태 확인이 포함됩니다. , 다시 로그인하거나 새로운 토큰을 요청하려면 기술 지원팀이나 개발자에게 문의하세요. 자세한 소개: 1. 토큰이 만료되었는지 확인하세요. 일반적으로 로그인 토큰에는 유효 기간이 설정되어 있습니다. 유효 기간이 초과되면 유효하지 않은 것으로 간주됩니다.

nvm을 사용하여 노드를 삭제하는 방법: 1. "nvm-setup.zip"을 다운로드하여 C 드라이브에 설치합니다. 2. "nvm -v" 명령을 통해 환경 변수를 구성하고 버전 번호를 확인합니다. install" 명령 노드 설치; 4. "nvm uninstall" 명령을 통해 설치된 노드를 삭제합니다.

유효하지 않은 로그인 토큰 문제는 네트워크 연결 확인, 토큰 유효 기간 확인, 캐시 및 쿠키 삭제, 로그인 상태 확인, 애플리케이션 개발자 문의 및 계정 보안 강화를 통해 해결할 수 있습니다. 자세한 소개: 1. 네트워크 연결을 확인하고 네트워크에 다시 연결하거나 네트워크 환경을 변경합니다. 2. 토큰 유효 기간을 확인하고 새 토큰을 얻거나 애플리케이션 개발자에게 문의합니다. 3. 캐시 및 쿠키를 지우고 브라우저를 지웁니다. 캐시 및 쿠키를 확인한 후 다시 애플리케이션에 로그인하세요. 4. 로그인 상태를 확인하세요.

파일 업로드를 처리하는 방법은 무엇입니까? 다음 글에서는 Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

Redis는 사용자 토큰을 저장합니다. 전자 상거래와 유사한 시스템을 설계할 때 일반적인 요구 사항은 각 페이지에 로그인된 사용자 정보를 전달해야 한다는 것입니다. 두 가지 일반적인 솔루션이 있습니다. 쿠키를 사용하여 저장하는 것과 JWT를 사용하여 저장하는 것입니다. 그러나 Redis 캐시가 시스템에서 사용되는 경우 Redis에서 사용자 토큰을 캐싱하는 세 번째 솔루션도 있습니다. 로그인 시 토큰을 생성하여 Redis에 저장 //토큰 객체를 생성하여 redis에 저장 redisTemplate.opsForHash().put("token","user",user)

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

이 기사에서는 Node의 프로세스 관리 도구인 "pm2"를 공유하고 pm2가 필요한 이유, pm2 설치 및 사용 방법에 대해 설명합니다. 모두에게 도움이 되기를 바랍니다!

"node-gyp.js"와 "Node.js"의 버전이 일치하지 않아 npm node gyp가 실패했습니다. 해결 방법: 1. "npm 캐시 clean -f"를 통해 노드 캐시를 지웁니다. 2. "npm install - g n" n 모듈을 설치합니다. 3. "n v12.21.0" 명령을 통해 "node v12.21.0" 버전을 설치합니다.
