服务器: 这个 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是其授予的签名:
-
生成Token时,服务器会使用密钥(例如:对称密钥或非对称密钥对)对Token进行加密或签名。在JWT中,这一过程通常使用HS256、RS256等加密算法完成。
-
服务器将生成的Token发送给浏览器。浏览器在后续请求中将Token附加到请求头中。通常,这是通过"Authorization"请求头实现的,格式为 “Bearer ”。
-
当服务器收到带有Token的请求时,它会对Token进行验证。这一过程包括解密(对称密钥)或验证签名(非对称密钥对),并检查Token中的有效期、颁发者等信息。
-
如果验证成功,服务器会根据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 是我的吗? 我不信的主要内容,如果未能解决你的问题,请参考以下文章
网络应用中session和token本质是一样的吗,有啥区别