如何从Bearer令牌中提取令牌字符串?

ycs*_*hao 5 node.js jwt

例如,我在标头中跟随Bearer JWT,提取令牌本身的一种优雅方法是什么?以后基本上什么都没有Bearer。由于这可以采用其他格式,因此我不希望它始终以开头Bearer。我正在使用node-jsonwebtoken,但没有找到这种方法。

Authorization: Bearer eyJhbGciOiJIUzI1NiIXVCJ9...TJVA95OrM7E20RMHrHDcEfxjoYZgeFONFh7HgQ

ped*_*ofb 16

出于安全原因,您应确保Authorization标头具有预期的内容。Bearer如果期望的话,您根本不应该接受不以该开头的标头(“ Bearer”是RFC中的建议,不是强制性的)。

if (authHeader.startsWith("Bearer ")){
     token = authHeader.substring(7, authHeader.length);
} else {
   //Error
}
Run Code Online (Sandbox Code Playgroud)


Sin*_*dro 11

我编写了一个函数,用于从请求标头或查询中提取令牌。我把它贴在这里。希望它可以帮助某人。

function extractToken (req) {
    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
        return req.headers.authorization.split(' ')[1];
    } else if (req.query && req.query.token) {
        return req.query.token;
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

  • 您调用 split() 两次,效率很低。 (4认同)

小智 9

对于 typescript、nodejs,导入jwt-decode

import jwtDecode from 'jwt-decode';

    const authHeader = String(req.headers['authorization'] || '');
    if (authHeader.startsWith('Bearer ')) {
      const token = authHeader.substring(7, authHeader.length);
      const payload = jwtDecode(token) as JwtPayload;
    }
Run Code Online (Sandbox Code Playgroud)

JwtPayload是一个接口或类。

export interface JwtPayload {
  id: string;
  username: string;
  email: string;
  role: string;
  expire: number;
}
Run Code Online (Sandbox Code Playgroud)


Ani*_*aha 7

您可以使用以下方式分割空间

TokenArray = jwttoken.split(" ");
Run Code Online (Sandbox Code Playgroud)

它将以数组形式存储,其中第二个索引(第一个索引为0时为1)TokenArray[1] 将是令牌并使用

Jwt.decode(TokenArray[1])
Run Code Online (Sandbox Code Playgroud)

解码令牌JWT是一种令牌标准,您可以在许多标准中使用它,其中一种最常用的情况是用于授权,它也可以通过多种方式完成,但是首选的标准方式是在承载授权标头中发送它您可以refresh_token改用,bearer token但必须将令牌存储在某个地方,这将以某种方式降低术语stateless令牌的效率。因此,承载方式完全是无状态的,是首选方法

  • 请小心解码,因为它不会验证令牌是否有效,请使用验证,如果无效则处理拒绝 (6认同)

小智 6

返回令牌的简单实用函数

function getToken(req) {
  if (
    req.headers.authorization &&
    req.headers.authorization.split(" ")[0] === "Bearer"
  ) {
    return req.headers.authorization.split(" ")[1];
  } 
  return null;
}
Run Code Online (Sandbox Code Playgroud)

然后可以将令牌传递给其他方法。例如,验证签名。


  const token = getToken(req);

  if (!token) {
    throw new Error("Authorization token is required");
  } 
 jwt.verify(token, secret, function (err, decoded) {
    if (err) {
      throw new Error("Error : " + err);
    }
    console.log(decoded);
  });
Run Code Online (Sandbox Code Playgroud)