服务器: 这个 token 是我的吗? 我不信

Posted 洪宏鸿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务器: 这个 token 是我的吗? 我不信相关的知识,希望对你有一定的参考价值。

人生有两个悲剧:第一是想得到的得不到,第二是想得到的得到了

其实token的出现是为了解决sessionId存放的问题

sessionId 在分布式系统, 如果你存放在一台机器, 让一台机器服务负责session相关的存放, 存放单点故障的风险, 这是有状态的, 那么如果用token进行改进的话, 就可以做到无状态了, 但是呢?

给了一个token, 可是服务器怎么认这个token是我颁发给服务器的呢?

在安全认证领域, 登录之后通常会给一个token, 方便浏览器记住用户, 数字签名 token, 服务器是怎么认出是他授予的签名, 我介绍一下服务器是如何认出token和jwt是他授予的签名的

在安全认证领域,Token(令牌)是一种常用的认证机制。通常,在用户登录成功后,服务器会生成一个Token并返回给浏览器。浏览器将此Token存储在本地,并在后续请求中将其附加到请求头中。服务器收到请求后,会验证Token的有效性并据此确定用户身份。JSON Web Token(JWT)是一种常用的Token格式。

服务器如何认出Token和JWT是其授予的签名:

  1. 生成Token时,服务器会使用密钥(例如:对称密钥或非对称密钥对)对Token进行加密或签名。在JWT中,这一过程通常使用HS256、RS256等加密算法完成。

  2. 服务器将生成的Token发送给浏览器。浏览器在后续请求中将Token附加到请求头中。通常,这是通过"Authorization"请求头实现的,格式为 “Bearer ”。

  3. 当服务器收到带有Token的请求时,它会对Token进行验证。这一过程包括解密(对称密钥)或验证签名(非对称密钥对),并检查Token中的有效期、颁发者等信息。

  4. 如果验证成功,服务器会根据Token中的载荷(Payload)识别出用户身份,并处理相应的请求。否则,服务器将拒绝该请求,可能返回401未授权或403禁止访问等状态码。

在Java中,我们可以使用诸如"java-jwt"、"jjwt"等库来处理JWT。以下是一个简单的示例,展示了如何使用"java-jwt"库生成和验证JWT:

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;

public class JwtDemo 
    private static final String SECRET_KEY = "my-secret-key";

    public static void main(String[] args) 
        // 生成JWT
        String token = generateJwt("user-id-123");

        // 验证JWT
        try 
            DecodedJWT decodedJwt = verifyJwt(token);
            System.out.println("User ID: " + decodedJwt.getClaim("userId").asString());
         catch (JWTVerificationException e) 
            System.out.println("Invalid JWT!");
        
    

    private static String generateJwt(String userId) 
        Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
        return JWT.create()
            .withIssuer("auth0")
            .withClaim("userId", userId)
            .sign(algorithm);
    

    private static DecodedJWT verifyJwt(String token) throws JWTVerificationException 
        Algorithm algorithm = Algorithm.HMAC256(SECRET_KEY);
        return JWT.require(algorithm)
            .withIssuer("auth0")
            .build()
            .verify(token);
    


在这个例子中,我们使用HMAC256算法和一个对称密钥生成和验证JWT。当然,实际应用中可以根据需求选择其他算法和密钥类型。总之,服务器通过对Token进行解密或验证签名来识别出Token

SyntaxError: Unexpected token 开始时

【中文标题】SyntaxError: Unexpected token 开始时【英文标题】:SyntaxError: Unexpected token while startingSyntaxError: Unexpected token 开始时 【发布时间】:2019-01-24 18:10:13 【问题描述】:

原因: 所以,我在搞乱 node.js 版本(更新),我不小心让我的 node.js 程序不再工作了。问题是我不记得在此之前我有什么 node.js 版本。至少,当我这样做时,它就开始发生了。

问题: 当我使用node app.js 启动我的程序时,我得到以下信息:

 $ node app.js
 /home/sunnlightbro/ftp/discordbot/schwi/app.js:3
 const token = require(path.join(__dirname, 'auth.json'));
       ^

 SyntaxError: Unexpected token 
     at exports.runInThisContext (vm.js:53:16)
     at Module._compile (module.js:374:25)
     at Object.Module._extensions..js (module.js:417:10)
     at Module.load (module.js:344:32)
     at Function.Module._load (module.js:301:12)
     at Function.Module.runMain (module.js:442:10)
     at startup (node.js:136:18)
     at node.js:966:3

现在我知道我的代码是正确的,因为它在此之前一直在工作。 PS:考虑到我使用了很多变量,其他类需要 。只是碰巧在这个令牌案例中它只有 1 个变量。

代码:

const path = require('path');
const Ononoki = require(path.join(__dirname, 'Ononoki.js'));
const token = require(path.join(__dirname, 'auth.json'));

start = function () 
    new Ononoki(token).init();
;

start();

老实说,除了节点版本或某些错误之外,我不知道原因可能是什么。感谢您的回复。

【问题讨论】:

更新到最新版本。 我试过了。但我收到以下错误。 return process.dlopen(module, path.toNamespacedPath(filename));Error: libcairo.so.2: cannot open shared object file: No such file or directory 您当前运行的是哪个版本?您可以在终端中通过node -v 进行检查 @McRist 我原来的错误是 V4.2.6。我在这里的评论错误是 v10.8.0。但现在我正在研究我的新液滴,它是 4.2.6 版 【参考方案1】:

尝试删除 node_modules 并在根文件夹中再次运行 npm install。

$ rm -rf node_modules/

$ npm update

$ npm install

【讨论】:

安装完成但出现错误。但它的工作完美无瑕! node app.js 启动我的应用程序。但是,我收到了这个和更多错误:node-pre-gyp ERR! Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/sqlite3/v4.0.0/node-v64-linux-x64.tar.gz node-pre-gyp ERR! Pre-built binaries not found for sqlite3@4.0.0 and node@10.8.0 (node-v64 ABI, glibc) (falling back to source compile with node-gyp) 有什么我应该关注的重大问题吗? 成功删除 node_modules ? 是的,它是成功的。应用程序现在工作正常。但是我在更新时遇到了很多错误。之后我什至没有npm install

以上是关于服务器: 这个 token 是我的吗? 我不信的主要内容,如果未能解决你的问题,请参考以下文章

Python可以减少代码量?我不信

face++生成的facetoken是唯一的吗

网络应用中session和token本质是一样的吗,有啥区别

Spotipy 使用授权代码流刷新令牌

如何在 Sanctum Laravel 中通过 Token 获取用户

这个主板制作的是一样的吗?