목차
1. 토큰 로그인 인증
2. 이중 토큰이란 무엇입니까?
npm install koa-generator -g
로그인 후 복사
" >
npm install koa-generator -g
로그인 후 복사
koa2 server
로그인 후 복사
" >
koa2 server
로그인 후 복사
npm i axios
로그인 후 복사
" >
npm i axios
로그인 후 복사
웹 프론트엔드 View.js Vue3+Vite가 듀얼 토큰을 사용하여 무의미한 새로 고침을 달성하는 방법

Vue3+Vite가 듀얼 토큰을 사용하여 무의미한 새로 고침을 달성하는 방법

May 10, 2023 pm 01:10 PM
vue3 vite token

1. 토큰 로그인 인증

jwt: JSON 웹 토큰. 요청된 신원 정보와 신원 권한을 확인하기 위해 일반적으로 사용되는 인증 프로토콜입니다. Header, Hayload, Signature 세 부분으로 구성

header: 즉, 이 토큰을 설명하는 기본 정보인 헤더 정보, json 형식

{
  "alg": "HS256", // 表示签名的算法,默认是 HMAC SHA256(写成 HS256)
  "type": "JWT" // 表示Token的类型,JWT 令牌统一写为JWT
}
로그인 후 복사

payload: 실제 데이터를 저장하는 데 사용되는 JSON 객체이기도 한 payload 전송해야 하는 것입니다. 비밀번호 등 민감한 정보는 저장하지 않는 것이 좋습니다.

{
  "iss": "a.com", // 签发人
  "exp": "1d", // expiration time 过期时间
  "sub": "test", // 主题
  "aud": "", // 受众
  "nbf": "", // Not Before 生效时间
  "iat": "", // Issued At 签发时间
  "jti": "", // JWT ID 编号
  // 可以定义私有字段
  "name": "",
  "admin": ""
}
로그인 후 복사

서명이란 데이터가 변조되는 것을 방지하기 위한 처음 두 부분의 서명입니다. 키를 지정해야 합니다. 이 키는 서버에만 알려져 있으며 유출될 수 없습니다. 헤더에 지정된 서명 알고리즘을 사용하여 수식에 따라 서명을 생성합니다.

서명을 계산한 후 Header, Payload, Signature 세 부분을 문자열로 결합하고 각 부분을 . 이렇게 하면 토큰이 생성됩니다

2. 이중 토큰이란 무엇입니까?

  • accessToken의 만료 시간이 더 짧고 RefreshToken의 만료 시간이 더 긴 이중 토큰 확인 메커니즘입니다. accessToken이 만료되면 RefreshToken을 사용하여 새 토큰을 요청하세요. accessToken:用户获取数据权限

  • refreshToken

    이중 토큰 확인 프로세스

사용자가 로그인하고 계정 비밀번호를 서버로 전송합니다. 로그인에 실패하면 클라이언트로 돌아가 다시 로그인합니다. 로그인에 성공하면 서버는 accessToken과 RefreshToken을 생성하고 생성된 토큰을 클라이언트에 반환합니다.

  • 요청 인터셉터에서 요청 헤더는 accessToken 요청 데이터를 전달하고 서버는 accessToken이 만료되었는지 여부를 확인합니다. 토큰이 유효하면 계속해서 데이터를 요청하세요. 토큰이 유효하지 않으면 무효화 정보가 클라이언트에 반환됩니다.

  • 클라이언트는 서버에서 보낸 요청 정보를 받고, 두 번 캡슐화된 Axios 응답 인터셉터에 accessToken 무효화 정보가 있는지 확인하지만 응답 데이터가 반환되지 않습니다. 잘못된 정보가 있는 경우 RefreshToken을 가져와서 새로운 accessToken을 요청하세요.

  • 서버는 RefreshToken이 유효한지 확인합니다. 유효하면 토큰이 다시 생성되고 새 토큰과 프롬프트 정보가 클라이언트에 반환됩니다. 유효하지 않으면 유효하지 않은 정보가 클라이언트에 반환됩니다.

  • 클라이언트 응답 인터셉터는 응답 정보에 유효한 새로 고침 토큰이 있는지 여부를 결정합니다. 잘못되었습니다. 현재 로그인에서 로그아웃하세요. 유효합니다. 새 토큰을 복원하고 마지막 요청의 데이터를 계속 요청합니다.

  • Notes

서버가 요청을 거부하고 토큰 무효화 정보를 반환합니다. 프런트 엔드에서는 민감하지 않은 효과를 얻기 위해 데이터를 다시 요청하는 방법을 요청합니다. 새로 고치다.

  • 서버 화이트리스트, 로그인 성공 전에 토큰이 요청되지 않았으므로 서버가 요청을 가로채면 로그인할 수 없습니다. 로그인 시 토큰 확인이 필요하지 않도록 화이트리스트를 사용자 정의하세요.

  • 3. 서버 코드

    1. koa2 서버 구축
전역적으로 koa 스캐폴딩 설치

npm install koa-generator -g
로그인 후 복사

koa2+ 프로젝트 이름

koa2 server
로그인 후 복사

cd 서버를 직접 생성하고 프로젝트에 들어가서 jwt

npm i jsonwebtoken
로그인 후 복사

를 설치합니다. 서비스에서 마지막에 koa-cors 크로스 도메인을 사용하세요

npm i koa-cors
로그인 후 복사

app.js에 애플리케이션 Cors를 도입하세요

const cors=require('koa-cors')
...
app.use(cors())
로그인 후 복사

2. Double token

새 utils/token.js를 만드세요

const jwt=require('jsonwebtoken')

const secret='2023F_Ycb/wp_sd'  // 密钥
/*
expiresIn:5 过期时间,时间单位是秒
也可以这么写 expiresIn:1d 代表一天 
1h 代表一小时
*/
// 本次是为了测试,所以设置时间 短token5秒 长token15秒
const accessTokenTime=5  
const refreshTokenTime=15 

// 生成accessToken
const setAccessToken=(payload={})=>{  // payload 携带用户信息
    return jwt.sign(payload,secret,{expireIn:accessTokenTime})
}
//生成refreshToken
const setRefreshToken=(payload={})=>{
    return jwt.sign(payload,secret,{expireIn:refreshTokenTime})
}

module.exports={
    secret,
    setAccessToken,
    setRefreshToken
}
로그인 후 복사

3. 프로젝트가 생성되었습니다. 스캐폴딩을 직접 사용하는 것은 이미 앱에 있습니다. js는 라우팅 미들웨어를 사용하여 router/index.js

const router = require('koa-router')()
const jwt = require('jsonwebtoken')
const { getAccesstoken, getRefreshtoken, secret }=require('../utils/token')

/*登录接口*/
router.get('/login',()=>{
    let code,msg,data=null
    code=2000
    msg='登录成功,获取到token'
    data={
        accessToken:getAccessToken(),
        refreshToken:getReferToken()
    }
    ctx.body={
        code,
        msg,
        data
    }
})

/*用于测试的获取数据接口*/
router.get('/getTestData',(ctx)=>{
    let code,msg,data=null
    code=2000
    msg='获取数据成功'
    ctx.body={
        code,
        msg,
        data
    }
})

/*验证长token是否有效,刷新短token
  这里要注意,在刷新短token的时候回也返回新的长token,延续长token,
  这样活跃用户在持续操作过程中不会被迫退出登录。长时间无操作的非活
  跃用户长token过期重新登录
*/
router.get('/refresh',(ctx)=>{
    let code,msg,data=null
    //获取请求头中携带的长token
    let r_tk=ctx.request.headers['pass']
    //解析token 参数 token 密钥 回调函数返回信息
    jwt.verify(r_tk,secret,(error)=>{
        if(error){
            code=4006,
            msg='长token无效,请重新登录'
        } else{
            code=2000,
            msg='长token有效,返回新的token',
            data={
                accessToken:getAccessToken(),
                refreshToken:getReferToken()
            }
        }
    })
})
로그인 후 복사

4에 인터페이스를 만듭니다. 애플리케이션 미들웨어

utils/auth.js

const { secret } = require('./token')
const jwt = require('jsonwebtoken')

/*白名单,登录、刷新短token不受限制,也就不用token验证*/
const whiteList=['/login','/refresh']
const isWhiteList=(url,whiteList)=>{
        return whiteList.find(item => item === url) ? true : false
}

/*中间件
 验证短token是否有效
*/
const cuth = async (ctx,next)=>{
    let code, msg, data = null
    let url = ctx.path
    if(isWhiteList(url,whiteList)){
        // 执行下一步
        return await next()
    } else {
        // 获取请求头携带的短token
        const a_tk=ctx.request.headers['authorization']
        if(!a_tk){
            code=4003
            msg='accessToken无效,无权限'
            ctx.body={
                code,
                msg,
                data
            }
        } else{
            // 解析token
            await jwt.verify(a_tk,secret.(error)=>{
                if(error)=>{
                      code=4003
                      msg='accessToken无效,无权限'
                      ctx.body={
                          code,
                          msg,
                          datta
                      }
                } else {
                    // token有效
                    return await next()
                }
            })
        }
    }
}
module.exports=auth
로그인 후 복사

app.js에 애플리케이션 미들웨어를 소개합니다

const auth=requier(./utils/auth)
···
app.use(auth)
로그인 후 복사

사실 하나만 만들면 간단한 이중 토큰 검증을 위해서는 정적 리소스를 구문 분석하는 등 많은 미들웨어가 필요하지 않습니다. 하지만 시간 절약과 편의성을 위해 koa2 스캐폴딩을 직접 사용했습니다.

최종 디렉토리 구조:

IV. 프론트엔드 코드

1. Vue3+Vite 프레임워크

프런트엔드는 Vue3+Vite 프레임워크를 사용하며 개인 사용 습관에 따라 다릅니다. Vue3+Vite가 듀얼 토큰을 사용하여 무의미한 새로 고침을 달성하는 방법

npm init vite@latest client_side
로그인 후 복사

axios 설치

npm i axios
로그인 후 복사

2. 사용된 상수 정의

config/constants.js

export const ACCESS_TOKEN = 'a_tk' // 短token字段
export const REFRESH_TOKEN = 'r_tk' // 短token字段
export const AUTH = 'Authorization'  // header头部 携带短token
export const PASS = 'pass' // header头部 携带长token
로그인 후 복사

3. 만료된 요청 저장 및 호출

핵심 사항: 만료된 토큰을 포함하는 요청을 배열에 저장합니다. 보류 상태, 즉 해결()을 호출하지 마십시오. 새 토큰을 얻으면 다시 요청하세요. utils/refresh.js

export {REFRESH_TOKEN,PASS} from '../config/constants.js'
import { getRefreshToken, removeRefreshToken, setAccessToken, setRefreshToken} from '../config/storage'

let subsequent=[]
let flag=false // 设置开关,保证一次只能请求一次短token,防止客户多此操作,多次请求

/*把过期请求添加在数组中*/
export const addRequest = (request) => {
    subscribes.push(request)
}

/*调用过期请求*/
export const retryRequest = () => {
    console.log('重新请求上次中断的数据');
    subscribes.forEach(request => request())
    subscribes = []
}

/*短token过期,携带token去重新请求token*/
export const refreshToken=()=>{
    if(!flag){
        flag = true;
        let r_tk = getRefershToken() // 获取长token
        if(r_tk){
            server.get('/refresh',Object.assign({},{
                headers:{[PASS]=r_tk}
            })).then((res)=>{
                //长token失效,退出登录
                if(res.code===4006){
                    flag = false
                    removeRefershToken(REFRESH_TOKEN)
                } else if(res.code===2000){
                    // 存储新的token
                    setAccessToken(res.data.accessToken)
                    setRefreshToken(res.data.refreshToken)
                    flag = false
                    // 重新请求数据
                    retryRequest()
                }
            })
        }
    }
}
로그인 후 복사

4. axios 캡슐화

utlis/server.js

import axios from "axios";
import * as storage from "../config/storage"
import * as constants from '../config/constants'
import { addRequest, refreshToken } from "./refresh";

const server = axios.create({
    baseURL: 'http://localhost:3004', // 你的服务器
    timeout: 1000 * 10,
    headers: {
        "Content-type": "application/json"
    }
})

/*请求拦截器*/
server.interceptors.request.use(config => {
    // 获取短token,携带到请求头,服务端校验
    let aToken = storage.getAccessToken(constants.ACCESS_TOKEN)
    config.headers[constants.AUTH] = aToken
    return config
})

/*响应拦截器*/
server.interceptors.response.use(
    async response => {
        // 获取到配置和后端响应的数据
        let { config, data } = response
        console.log('响应提示信息:', data.msg);
        return new Promise((resolve, reject) => {
            // 短token失效
            if (data.code === 4003) {
                // 移除失效的短token
                storage.removeAccessToken(constants.ACCESS_TOKEN)
                // 把过期请求存储起来,用于请求到新的短token,再次请求,达到无感刷新
                addRequest(() => resolve(server(config)))
                // 携带长token去请求新的token
                refreshToken()
            } else {
                // 有效返回相应的数据
                resolve(data)
            }

        })

    },
    error => {
        return Promise.reject(error)
    }
)
로그인 후 복사

5. 캡슐화 재사용

import * as constants from "./constants"

// 存储短token
export const setAccessToken = (token) => localStorage.setItem(constanst.ACCESS_TOKEN, token)
// 存储长token
export const setRefershToken = (token) => localStorage.setItem(constants.REFRESH_TOKEN, token)
// 获取短token
export const getAccessToken = () => localStorage.getItem(constants.ACCESS_TOKEN)
// 获取长token
export const getRefershToken = () => localStorage.getItem(constants.REFRESH_TOKEN)
// 删除短token
export const removeAccessToken = () => localStorage.removeItem(constants.ACCESS_TOKEN)
// 删除长token
export const removeRefershToken = () => localStorage.removeItem(constants.REFRESH_TOKEN)
로그인 후 복사

6. 인터페이스 캡슐화

apis/index.js

import server from "../utils/server";
/*登录*/
export const login = () => {
    return server({
        url: '/login',
        method: 'get'
    })
}
/*请求数据*/
export const getData = () => {
    return server({
        url: '/getList',
        method: 'get'
    })
}
로그인 후 복사
프로젝트 실행 중

마지막으로 프로젝트를 실행하여 백엔드에 설정된 5초의 짧은 토큰과 10초의 긴 토큰의 효과를 확인합니다. 로그인 요청이 토큰에 도달한 후 정상적으로 요청 데이터를 요청할 수 있으며, 5초 후에 다시 요청하면 짧은 토큰이 무효화되며, 새로운 토큰을 요청하면 유효해집니다. , 새로 고침 인터페이스는 한 번만 호출됩니다. 긴 토큰이 만료된 후에는 다시 로그인해야 합니다.

위 내용은 Vue3+Vite가 듀얼 토큰을 사용하여 무의미한 새로 고침을 달성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Vue3+TS+Vite 개발 기술: SEO 최적화 방법 Vue3+TS+Vite 개발 기술: SEO 최적화 방법 Sep 10, 2023 pm 07:33 PM

Vue3+TS+Vite 개발 스킬: SEO 최적화 수행 방법 SEO(SearchEngineOptimization)는 웹사이트의 구조, 콘텐츠, 키워드를 최적화하여 검색 엔진에서 상위에 랭크되도록 하여 웹사이트의 트래픽과 노출을 높이는 것을 말합니다. Vue3+TS+Vite와 같은 현대 프론트엔드 기술의 개발에 있어서 SEO를 어떻게 최적화하는가는 매우 중요한 문제입니다. 이 기사에서는 Vue3+TS+Vite 개발 기술과 방법을 소개합니다.

vue3+vite: src에서 이미지를 동적으로 가져오기 위해 require를 사용할 때 오류를 해결하는 방법 vue3+vite: src에서 이미지를 동적으로 가져오기 위해 require를 사용할 때 오류를 해결하는 방법 May 21, 2023 pm 03:16 PM

vue3+vite:src는 require를 사용하여 이미지를 동적으로 가져오고 vue3+vite는 여러 이미지를 동적으로 가져옵니다. vue3을 사용하는 경우 require는 이미지를 사용할 수 없습니다. imgUrl:require(' .../assets/test.png') 와 같은 vue2는 typescript가 require를 지원하지 않기 때문에 가져오므로 이를 해결하는 방법은 다음과 같습니다. waitimport를 사용합니다.

Vue3에서 페이지의 일부 콘텐츠를 새로 고치는 방법 Vue3에서 페이지의 일부 콘텐츠를 새로 고치는 방법 May 26, 2023 pm 05:31 PM

페이지를 부분적으로 새로 고치려면 로컬 구성 요소(dom)의 다시 렌더링만 구현하면 됩니다. Vue에서 이 효과를 얻는 가장 쉬운 방법은 v-if 지시어를 사용하는 것입니다. Vue2에서는 v-if 명령을 사용하여 로컬 DOM을 다시 렌더링하는 것 외에도 새 빈 구성 요소를 만들 수도 있습니다. 로컬 페이지를 새로 고쳐야 할 경우 이 빈 구성 요소 페이지로 점프한 다음 다시 돌아올 수 있습니다. 빈 원본 페이지의 beforeRouteEnter 가드. 아래 그림과 같이 Vue3.X에서 새로 고침 버튼을 클릭하여 빨간색 상자 안에 DOM을 다시 로드하고 해당 로딩 상태를 표시하는 방법입니다. Vue3.X의 scriptsetup 구문에 있는 구성 요소의 가드에는

잘못된 로그인 토큰 문제를 해결하는 방법 잘못된 로그인 토큰 문제를 해결하는 방법 Sep 14, 2023 am 10:57 AM

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

Vue3+TS+Vite 개발 기술: 데이터 암호화 및 저장 방법 Vue3+TS+Vite 개발 기술: 데이터 암호화 및 저장 방법 Sep 10, 2023 pm 04:51 PM

Vue3+TS+Vite 개발 팁: 데이터를 암호화하고 저장하는 방법 인터넷 기술의 급속한 발전으로 인해 데이터 보안 및 개인 정보 보호가 점점 더 중요해지고 있습니다. Vue3+TS+Vite 개발 환경에서 데이터를 암호화하고 저장하는 방법은 모든 개발자가 직면해야 하는 문제입니다. 이 기사에서는 개발자가 애플리케이션 보안 및 사용자 경험을 개선하는 데 도움이 되는 몇 가지 일반적인 데이터 암호화 및 저장 기술을 소개합니다. 1. 데이터 암호화 프런트엔드 데이터 암호화 프런트엔드 암호화는 데이터 보안을 보호하는 중요한 부분입니다. 일반적으로 사용되는

Vue3+TS+Vite 개발 기술: 도메인 간 요청 및 네트워크 요청을 최적화하는 방법 Vue3+TS+Vite 개발 기술: 도메인 간 요청 및 네트워크 요청을 최적화하는 방법 Sep 09, 2023 pm 04:40 PM

Vue3+TS+Vite 개발 기술: 도메인 간 요청 및 네트워크 요청을 최적화하는 방법 소개: 프런트 엔드 개발에서 네트워크 요청은 매우 일반적인 작업입니다. 페이지 로딩 속도와 사용자 경험을 개선하기 위해 네트워크 요청을 최적화하는 방법은 개발자가 고려해야 할 문제 중 하나입니다. 동시에 다른 도메인 이름으로 요청을 보내야 하는 일부 시나리오의 경우 도메인 간 문제를 해결해야 합니다. 이 기사에서는 Vue3+TS+Vite 개발 환경에서 도메인 간 요청 및 네트워크 요청 최적화 기술을 만드는 방법을 소개합니다. 1. 도메인 간 요청 솔루션

로그인 토큰이 유효하지 않은 경우 수행할 작업 로그인 토큰이 유효하지 않은 경우 수행할 작업 Sep 14, 2023 am 11:33 AM

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

Vue3+TS+Vite 개발 기술: 프런트 엔드 보안 보호를 수행하는 방법 Vue3+TS+Vite 개발 기술: 프런트 엔드 보안 보호를 수행하는 방법 Sep 09, 2023 pm 04:19 PM

Vue3+TS+Vite 개발 기술: 프런트 엔드 보안 보호를 수행하는 방법 프런트 엔드 기술의 지속적인 개발로 인해 점점 더 많은 회사와 개인이 프런트 엔드 개발에 Vue3+TS+Vite를 사용하기 시작하고 있습니다. 그러나 이에 수반되는 보안 위험도 사람들의 관심을 끌었습니다. 이 기사에서는 몇 가지 일반적인 프런트 엔드 보안 문제에 대해 논의하고 Vue3+TS+Vite 개발 과정에서 프런트 엔드 보안을 보호하는 방법에 대한 몇 가지 팁을 공유합니다. 입력 유효성 검사 사용자 입력은 프런트엔드 보안 취약점의 주요 소스 중 하나인 경우가 많습니다. 존재하다

See all articles