koa2 token验证时 登录后要失效之前的该账号的token

koa2使用token做服务端验证时,如何失效该账号之前生成的 token

一般使用token做服务端验证时,登录一个账号会生成一个token,使用其他环境再次登录该账号可以生成另一个token,为了保证唯一,如何做到只生效一个token而却失效另外一个token。

阅读 4.1k
5 个回答

session.ts

import { MD5 } from './utils';

let token_map_session = {};
let session_map_token = {};

export const createSession = (token: string) => {
    const session = MD5(token + Date.now());
    const old_session = token_map_session[token]
    delete session_map_token[old_session]
    
    token_map_session[token] = session;
    session_map_token[session] = token
    return session;
}

export const getSession = (token: string) => token_map_session[token]
export const getToken = (session_id: string | string[]) => {
    const id = [].concat(session_id).find(id => !!session_map_token[id])
    return session_map_token[id]
}

user.ts

// 伪代码
import { createSession, getSession, getToken } from './Session'
export const login = async (req, resp) => {
    const { username, password } = req.body;
    const u = await sql.find(username, password);
    if (u) {
        resp.setHeader('Set-Cookie', 'token=' + createSession(username + '&&' + password) )
    }
}
export const isLogin = async (req, resp) => {
    const cookie = getCookie(req);
    const token = getToken(cookie.token);
    const [username, password] = token.split('&&');
    const u = await sql.find(username, password);
    if (u) {
        // login ok
    } else {
        // redirect to login.html
    }
}

一个用户的登录状态只关联一个token,之前的token自动就失效了吧

token 可用 jsonwebtoken 第三方库生成,自动生效对应关系。

不知道楼主具体用的是什么『token』。通常来说,token有关联的过期时间,重新登录、生成新token时,只要顺带把旧的token的有效时间设置为过期,或直接删除 就可以。

比如 koa-session 里的destroy操作。

使用数据库记录用户的token即可。
本次登录的时候,检测数据库是否有旧的未过期的记录,有的话设成过期。

推荐问题