精华内容
下载资源
问答
  • token 令牌的含义: 是一个加密后的字符串,可以保存信息,也可以设置信息的有效期。 token的操作步骤 1.生成token,并且设置和保存数据和有效期(加密过程) 2.返回给前端进行保存 3.前端在请求的时候,携带...
    token 令牌的含义:
    • 是一个加密后的字符串,可以保存信息,也可以设置信息的有效期。
    token的操作步骤
    • 1.生成token,并且设置和保存数据和有效期(加密过程)
    • 2.返回给前端进行保存
    • 3.前端在请求的时候,携带token
    • 4.后端对接收到的token进行校验(解密过程)
    • (1)校验通过,允许登录
    • (2)校验失败,让用户重新登录
    • 5.使用第三方模块:jsonwebtoken实现
    • (1)签名:进行加密
    展开全文
  • 从www.JavaPractices.com复制此代码中的令牌是什么意思?当我用更通用泛型类型替换它时,它无法编译。(错误:T无法解析为类型。)为什么?// > occurs 3 times in the entire program. When it is replaced ...

    >从www.JavaPractices.com复制的此代码中的令牌是什么意思?当我用更通用的泛型类型替换它时,它无法编译。(错误:T无法解析为类型。)为什么?

    // > occurs 3 times in the entire program. When it is replaced with the

    // program no longer compiles.

    void activateAlarmThenStop()

    {

    Runnable myPeriodicTask = new PeriodicTask();

    ScheduledFuture> soundAlarmFuture =

    this.executorService.scheduleWithFixedDelay(myPeriodicTask,

    startT,

    period,

    TimeUnit.SECONDS

    );

    Runnable stopAlarm = new StopAlarmTask(soundAlarmFuture);

    this.executorService.schedule(stopAlarm, stopT, TimeUnit.SECONDS);

    }

    private final class StopAlarmTask implements Runnable

    {

    StopAlarmTask(ScheduledFuture> aSchedFuture)

    {

    fSchedFuture = aSchedFuture;

    }

    public void run()

    {

    CConsole.pw.println("Stopping alarm.");

    fSchedFuture.cancel(doNotInterruptIfRunningFlag);

    executorService.shutdown();

    }

    private ScheduledFuture> fSchedFuture;

    }

    编辑:当然,当我们使用类似的通用类型标记时,它必须出现在类声明中。这里也没有,也没有>在类的声明,但它仍然可以编译和运行正常。

    展开全文
  • pmb令牌化模型 用于为(PMB)创建标记化(和句子分段)模型脚本。 使用标记器。 当前创建一个基于英语黄金数据训练模型。 即将推出:其他语言,有关白银数据培训。 用法 确保存在子模块: git submodule ...
  • 使用JWT结构化令牌

    2021-03-29 13:07:08
    上一篇中提到生成令牌的方式都是默认一个随机字符串。而在结构化令牌这方面,目前用得最多的就是 JWT 令牌了。 JWT结构化令牌 JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的...

    上一篇中提到生成令牌的方式都是默认一个随机字符串。而在结构化令牌这方面,目前用得最多的就是 JWT 令牌了。

    JWT结构化令牌

    JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。

    简单理解下,JWT 就是用一种结构化封装的方式来生成 token 的技术。结构化后的 token 可以被赋予非常丰富的含义,这也是它与原先毫无意义的、随机的字符串形式 token 的最大区别。

    JWT 这种结构化体可以分为 HEADER(头部)、PAYLOAD(数据体)和 SIGNATURE(签名)三部分。经过签名之后的 JWT 的整体结构,是被句点符号分割的三段内容,结构为 header.payload.signature

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    

    把这段内容拷贝到 https://jwt.io/ 网站的在线校验工具中去,就可以看到解码之后的数据。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYr9ScyT-1616994417493)(http://qiniu.litblue.cn/Snipaste_2020-11-27_14-08-09.png)]

    JWT三部分

    HEADER

    表示装载令牌类型和算法等信息,是 JWT 的头部。其中,typ 表示第二部分 PAYLOAD 是 JWT 类型,alg 表示使用 HS256 对称签名的算法。

    PAYLOAD

    表示是 JWT 的数据体,代表了一组数据。其中,sub(令牌的主体,一般设为资源拥有者的唯一标识)、exp(令牌的过期时间戳)、iat(令牌颁发的时间戳)是 JWT 规范性的声明,代表的是常规性操作。更多的通用声明,可以参考RFC 7519 开放标准。不过,在一个 JWT 内可以包含一切合法的 JSON 格式的数据,也就是说,PAYLOAD 表示的一组数据允许我们自定义声明。

    SIGNATURE

    表示对 JWT 信息的签名。我们还需要对其进行加密签名处理,而 SIGNATURE 就是对信息的签名结果,当受保护资源接收到第三方软件的签名后需要验证令牌的签名是否合法。

    令牌内检

    题外话-“两个一伙”的概念:

    OAuth 2.0 中的 4 个角色是 “两两站队” 的:

    资源拥有者和第三方软件“站在一起”,因为第三方软件要代表资源拥有者去访问受保护资源;

    授权服务和受保护资源“站在一起”,因为授权服务负责颁发访问令牌,受保护资源负责接收并验证访问令牌。

    授权服务颁发令牌,受保护资源服务就要验证令牌。同时,授权服务和受保护资源服务通常是“一伙的”。受保护资源来调用授权服务提供的检验令牌的服务,我们把这种校验令牌的方式称为令牌内检。

    有时候授权服务依赖一个数据库,然后受保护资源服务也依赖这个数据库,也就是我们说的“共享数据库”。不过,在如今已经成熟的分布式以及微服务的环境下,不同的系统之间是依靠服务而不是数据库来通信了,比如授权服务给受保护资源服务提供一个 RPC 服务。

    那么,在有了 JWT 令牌之后,我们就多了一种选择,因为 JWT 令牌本身就包含了之前所要依赖数据库或者依赖 RPC 服务才能拿到的信息。

    JWT 是如何被使用的

    授权服务“扔出”一个令牌,受保护资源服务“接住”这个令牌,然后自己开始解析令牌本身所包含的信息就可以了,而不需要再去查询数据库或者请求 RPC 服务。

    实际上,授权服务颁发了 JWT 令牌后给到了第三方软件,第三方软件拿着 JWT 令牌来请求受保护资源服务。很显然,JWT 令牌需要在公网上做传输。所以在传输过程中,JWT 令牌需要进行 Base64 编码以防止乱码,同时还需要进行签名及加密处理来防止数据信息泄露。

    我们可以借助一些开源工具来帮助我们完成处理编码,加密等工作。待会通过案例介绍。

    JWT格式令牌的优势

    计算代替存储

    JWT 的核心思想,就是用计算代替存储。这种经过计算并结构化封装的方式,也减少了“共享数据库” 因远程调用而带来的网络传输消耗,所以也有可能是节省时间的。

    加密

    JWT 令牌内部已经包含了重要的信息,所以在整个传输过程中都必须被要求是密文传输的,这样被强制要求了加密也就保障了传输过程中的安全性。这里的加密算法,既可以是对称加密,也可以是非对称加密。

    增强可用性和可伸缩性

    这种 JWT 格式的令牌,通过“自编码”的方式包含了身份验证需要的信息,不再需要服务端进行额外的存储,所以每次的请求都是无状态会话。这就符合了我们尽可能遵循无状态架构设计的原则,也就是增强了系统的可用性和伸缩性。

    JWT格式令牌的劣势

    JWT 格式令牌的最大问题在于 “覆水难收”,也就是说,没办法在使用过程中修改令牌状态

    用户在使用第三方软件的时候,是不是有可能出现修改密码或取消授权的操作?这时候,令牌的状态是不是就要有相应的变更,将原来对应的令牌置为无效。但,使用 JWT 格式令牌时,每次颁发的令牌都不会在服务端存储,这样我们要改变令牌状态的时候,就无能为力了。因为服务端并没有存储这个 JWT 格式的令牌。这就意味着,JWT 令牌在有效期内,是可以“横行无止”的。为了解决这个问题,我们可以把 JWT 令牌存储到远程的分布式内存数据库中吗?显然不能,因为这会违背 JWT 的初衷(将信息通过结构化的方式存入令牌本身)。因此,我们通常会有两种做法:

    • 一是,将每次生成 JWT 令牌时的秘钥粒度缩小到用户级别,也就是一个用户一个秘钥。这样,当用户取消授权或者修改密码后,就可以让这个密钥一起修改。一般情况下,这种方案需要配套一个单独的密钥管理服务;
    • 二是,在不提供用户主动取消授权的环境里面,如果只考虑到修改密码的情况,那么我们就可以把用户密码作为 JWT 的密钥。当然,这也是用户粒度级别的。这样一来,用户修改密码也就相当于修改了密钥。

    令牌的生命周期

    具体到 OAuth 2.0 的令牌生命周期,通常会有三种情况。

    自然过期

    这是最常见的情况。这个过程是,从授权服务创建一个令牌开始,到第三方软件使用令牌,再到受保护资源服务验证令牌,最后再到令牌失效。

    同时,这个过程也不排除主动销毁令牌的事情发生,比如令牌被泄露,授权服务可以做主让令牌失效。

    刷新令牌

    访问令牌失效之后可以使用刷新令牌请求新的访问令牌来代替失效的访问令牌,以提升用户使用第三方软件的体验。(上一篇文章中有较详细的说明)

    主动发起令牌失效请求

    就是让第三方软件主动发起令牌失效的请求,然后授权服务收到请求之后让令牌立即失效。但是这种应用场景并不常见,比如有些时候,用户和第三方软件之间存在一种订购关系。比如用户购买了第三方软件,那么在订购时长到期或者退订,且用户授权的 token 还没有到期的情况下,就需要有这样的一种令牌撤回协议,来支持第三方软件软件主动发起令牌失效的请求。

    Spring Boot整合JWT实战

    代码实践直接放在了GitHub仓库中:springboot-jwt/

    Spring Security(含OAuth2三角色+三模式完整例子)

    这个直接看朱晔老师写的文章:朱晔和你聊Spring系列S1E10:强大且复杂的Spring Security(含OAuth2三角色+三模式完整例子)

    展开全文
  • SpringSecurity 原理解析【4】:令牌还原与SessionSession:一般称为会话,不同环境中含义不同,在Spring Security中一个会话指:客户端从令牌认证请求到登出注销请求之间过程。Web应用基本都是基于HTTP协议,而该...

    SpringSecurity 原理解析【4】:令牌还原与Session

    Session:一般称为会话,不同环境中含义不同,在Spring Security中一个会话指:客户端从令牌认证请求到登出注销请求之间的过程。Web应用基本都是基于HTTP协议,而该协议是一个无状态协议,两个HTTP请求相互独立,无法识别对方,在Web应用特别是Spring Security等安全框架中,同一个客户端发出的多个请求,如果不能识别出,每个请求都需要认证过程,这对于每次请求都需要主动提供身份识别信息的客户端而言绝对是一个灾难。因此需要一个方案来解决这个问题:解决方案整体而言只有一个:就给相关的HTTP请求添加一个全局总线,将这些HTTP请求打上统一标志来说明这些请求都是来自同一个身份。而实现目前主流两种:Session 和 WebToken,前者为主流标准Web应用总线方案实现,标志打在Cookie或者URL上,后者为主流前后端分离Web应用总线方案实现,标志打在请求头上。

    今天主要说明前者Session。在JavaEE中Session特指HttpSession,其规范是在服务器端定义且实现的:默认每个请求都会具有一个Session实例

    public interface HttpSession {

    // 创建时间

    long getCreationTime();

    boolean isNew();

    // 唯一ID

    String getId();

    // 最近一次访问时间

    long getLastAccessedTime();

    //Servlet上下文

    ServletContext getServletContext();

    // 具有失效能力

    void invalidate();

    void setMaxInactiveInterval(int var1);

    int getMaxInactiveInterval();

    // 具有存储能力

    Object getAttribute(String var1);

    Enumeration getAttributeNames();

    void setAttribute(String var1, Object var2);

    void removeAttribute(String var1);

    }

    此时可以这么理解Session:是一个具有唯一标识且可控生命周期的存储结构,底层一般为:ConcurrentMap。

    Session追踪

    会话追踪: SessionTracking,意思是追踪Session来源,也就是从哪里开始查找总线标记,默认为Cookie和URL,@since Servlet 3.0可配置

    public enum SessionTrackingMode {

    COOKIE, URL, SSL

    }

    Cookie就是将sessionId写入Cookie,URL则是在重定向时将sessionId写入URL。而解析Cookie或者URL是在HttpServer内部完成的,例如:tomcat、undertow。所以一般看不到Session构建的细节(不同服务器实现不一样),例如Tomcat服务器在构建Request时在CoyoteAdapter#postParseRequest,解析SessionId顺序为URL --> Cookie --> SSL ,且Cookie优先级最高,URL次之。

    虽然不用知道如何解析Session,但是JavaEE给出构建入口和构建要求:HttpServletRequest#getSession,默认情况下session的构建交给HttpServer完成,但对于分布式应用,可以由Spring Session模块接手Session的生命周期。

    注意如果会话追踪ID丢失,则会导致Session==null,后续所有依赖了Session存储的功能就会失败:例如:CsrfFilter

    // 主动确定返回的Session是否需要重新构建

    HttpSession getSession(boolean var1);

    // 获取当前请求的Session实例,如果不存在则构建

    HttpSession getSession();

    // 修改SessionId

    String changeSessionId();

    // Session有效性:是否存活

    boolean isRequestedSessionIdValid();

    // Session构建来源:是否从Cookie中解析

    boolean isRequestedSessionIdFromCookie();

    // Session构建来源:是否从URL中解析

    boolean isRequestedSessionIdFromURL();

    在Spring Security中在服务端完善令牌之后,可以从上篇文章图示中看到:令牌完整之后进行了Session、Context和Cookie管理.

    Session的处理是通过SessionAuthenticationStrategy来执行的。默认是组合(Composite)策略,内置:ChangeSessionIdAuthenticationStrategy,复用现有Session,修改其唯一标识。

    CsrfAuthenticationStrategy (org.springframework.security.web.csrf)

    ConcurrentSessionControlAuthenticationStrategy (org.springframework.security.web.authentication.session)

    RegisterSessionAuthenticationStrategy (org.springframework.security.web.authentication.session)

    CompositeSessionAuthenticationStrategy (org.springframework.security.web.authentication.session)

    NullAuthenticatedSessionStrategy (org.springframework.security.web.authentication.session)

    AbstractSessionFixationProtectionStrategy (org.springframework.security.web.authentication.session)

    ChangeSessionIdAuthenticationStrategy (org.springframework.security.web.authentication.session)

    SessionFixationProtectionStrategy (org.springframework.security.web.authentication.session)

    在Session做了案底之后就可以在后续请求中获取到并还原了

    令牌还原

    在Spring Security中有一个优先级很高的过滤器:SecurityContextPersistenceFilter:上下文持久化过滤器,还记得在FilterSecurityInterceptor中获取服务端完整令牌就是从SecurityContext中获取的吗?

    SecurityContext contextBeforeChainExecution = securityContextRepository.loadContext(holder);

    这里有个SecurityContextRepository,安全上下文存储库,默认是HttpSessionSecurityContextRepository,也就是从HttpSession中获取到的上下文。而HttpSession则在会话追踪中已经还原了。

    // -------------------------------- session 存储 ------------------------------

    // 先获取到请求中的Session

    HttpSession httpSession = request.getSession(false);

    // 从Session中获取SecurityContext

    SecurityContext context = readSecurityContextFromSession(httpSession);

    // context 就是从ConcurrentMap中 key="SPRING_SECURITY_CONTEXT"获取

    Object contextFromSession = httpSession.getAttribute(springSecurityContextKey);

    // -------------------------------- context 存储 ------------------------------

    SecurityContextHolder.setContext(context);

    到这里,Session的整体流程就清晰明了了,整体图示如下:

    5fa19d39bd6451f11077ff3ade973d4e.png

    Session配置

    Session细节交给了服务器去设置,但是Session的配置接口是规范好的:

    public interface SessionCookieConfig {

    // 名称配置:常见为:JSESSIONID

    void setName(String var1);

    String getName();

    // 设置能携带Cookie的请求域名

    // 后缀匹配,设置格式:点+域名

    void setDomain(String var1);

    String getDomain();

    // 设置能携带Cookie的请求路径

    // 前缀匹配:紧邻域名之后的部分URL,默认:/

    void setPath(String var1);

    String getPath();

    // 设置额外备注

    void setComment(String var1);

    String getComment();

    // 是否允许客户端操作Cookie

    void setHttpOnly(boolean var1);

    boolean isHttpOnly();

    // 设置能携带Cookie的请求方式:

    // ture: https,false: http、https

    void setSecure(boolean var1);

    boolean isSecure();

    // 有效期配置,默认-1,常见:3600

    void setMaxAge(int var1);

    int getMaxAge();

    }

    Spring对Server的Session有对应的配置类,在容器启动是会配置到Servlet中。示例:

    server.servlet.context-path= /ctx

    server.servlet.session.cookie.name= Authorization

    server.servlet.session.cookie.path= /ctx/cookie/

    server.servlet.session.cookie.max-age=3600

    server.servlet.session.cookie.http-only=true

    server.servlet.session.cookie.secure=false

    server.servlet.session.cookie.comment=new cookie name

    浏览器:

    Set-Cookie: Authorization=_xkjjuKHOrOLbS3KRlUmOrRYYn-Z9oa-cLCLWS54; Version=1; Path=/ctx/cookie/; HttpOnly; Max-Age=3600; Expires=Mon, 26-Oct-2020 02:25:57 GMT; Comment="new cookie name"

    后续携带Cookie

    Cookie: Authorization=dhiWDzOksYItVwcqIZAew0YQqtA8BI9DZIVUXWjK

    注意:Cookie的path默认为:"/",意味着任何页面如果携带Cookie,将是同一个。如果配置为其他值,一定要保证Spring Security的认证路径能匹配到来传输Cookie。配置格式应该为:"contextPath/匹配值路径/",表示匹配路径及其子路径都会携带匹配路径请求是产生的Cookie。

    展开全文
  • 37. 脚本系统之令牌

    2019-10-06 13:01:13
    文件可以由许多令牌组成,每个令牌都有自己用途和含义。在不考虑出现令牌原因情况下,令牌只是一些文本。如果愿意话,有时可以将文件分隔成一系列令牌——令牌流——这是一种很好做法。如果读者曾经研究过更...
  • SQL中token含义

    2019-07-22 16:58:25
    Token引入: 在Web领域基于Token身份验证随处可见。在大多数使用Web API互联网公司中,tokens 是多用户下处理认证最佳方式。...Token是服务端生成一串字符串,以作客户端进行请求一个令牌...
  • CIR、CBS、EBS、PIR、PBS的含义

    千次阅读 2018-10-22 15:20:26
     CIR、CBS、EBS、PIR、PBS的含义 在网络设备的中为了保障通信质量,一般会对网络中的流量进行基于VLAN的限速、基于IP第限速和基于接口的限速,最为常用的是基于接口的限速。 限速一般使用令牌桶的概念来实现,...
  • 文章目录一、了解会话管理机制二、令牌生成(一)、测试令牌的含义(二)、测试令牌的可预测性三、令牌处理(一)、检查不安全的令牌传输(二)、检查在日志中泄露的令牌(三)、测试令牌-会话映射(四)、测试会话...
  • 就拿前端、后端、前台、后台四个词来说,很多人无法区分它们的含义。今天小编就来给大家说一说这四个词究竟有什么区别。这四个词是两两对应的,其中前台与后台对应,而前端与后端对应。前端与后端与程序员有直接联系...
  • http响应码code含义

    2020-07-23 22:26:49
    401: ‘用户没有权限(令牌、用户名、密码错误)。’, 403: ‘用户得到授权,但是访问是被禁止。’, 404: ‘发出请求针对是不存在记录,服务器没有进行操作。’, 406: ‘请求格式不可得。’, 410: ‘请求...
  • 1,Falsh内存,存储器可以在不加电...以太网是目前应用最普遍局域网技术,取代了其他局域网标准如令牌环、FDDI和ARCNET。 4,互联网(英语:Internet)是一个网络网络,它是由从地方到全球范围内几百万个私人
  • OAuth 2.0 四种方式

    2020-04-24 14:58:49
    本文接着介绍颁发令牌的实务操作。 下面我假定,你已经理解了 OAuth 2.0 的含义和设计思想,否则请先阅读这个系列的上一篇文章。 RFC 6749 OAuth 2.0 的标准是RFC 6749文件。该文件先解释了 OAuth 是什么。 ...
  • 可以灵活选择令牌的形式,既可以是没有内部结构且不包含任何信息含义的随机字符串,也可以是具有内部结构且包含有信息含义的字符串。之前生成令牌的方式都是默认一个随机字符串。而在结构化令牌这方面,目前用得最多...
  • 上述的限流器的含义是:拥有一个容量为1的令牌桶,以每钞10个的速度向桶中放令牌。 除了直接指定每秒产生的 Token 个数外,还可以用 Every 方法来指定向 Token 桶中放置 Token 的间隔,例如: limiter := NewLimiter...
  • 可以灵活选择令牌的形式,既可以是没有内部结构且不包含任何信息含义的随机字符串,也可以是具有内部结构且包含有信息含义的字符串。之前生成令牌的方式都是默认一个随机字符串。而在结构化令牌这方面,目前用得最多...
  • Soul限流插件之RateLimiter插件 ...在选择器规则中两个主要的配置的含义 capacity(容量):是允许用户在一秒钟内执行的最大请求数。这是令牌桶可以保存的令牌数。 rate(速率):是你允许用户每秒执行多少请求,
  • 令牌的形式,既可以是没有内部结构且不包含任何信息含义的随机字符串,比如CAS 中的ST,也可以是具有内部结构且包含有信息含义的字符串,比如我们今天要介绍的JWT。 JWT不是一种认证协议,也不是一个开源软件的...
  • Token被翻译成为('令牌','标记')在计算机中的含义也差不错('计算机身份认证安全令牌'),token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。...
  • 本文接着介绍颁发令牌的实务操作。 下面我假定,你已经理解了 OAuth 2.0 的含义和设计思想,否则请先阅读这个系列的上一篇文章。 RFC 6749 OAuth 2.0 的标准是RFC 6749文件。该文件先解释了 OAuth 是什么。 ...
  • 这句话的含义是: 1:保护域是进入该区域内去调用 程序工作组件或者服务资源等必须要进行身份认证和鉴权的区域 j2ee等软件容器负责调用保护域内资源的调用者的身份认证功能 2:身份认证的标识常见的高端认证凭据...
  • 本文接着介绍颁发令牌的实务操作。下面我假定,你已经理解了 OAuth 2.0 的含义和设计思想,否则请先阅读这个系列的上一篇文章。进入正文之前,插播一则活动消息。4月22日(周一)到4月29日(下周一),每天晚上八点都有...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 154
精华内容 61
关键字:

令牌的含义