草庐IT

keycloak~再说session和token

敢于对过去告一个段落,才有信心掀开新的篇章! 2023-04-17 原文

我们需要认清session会话和token令牌的区别,在keycloak中,他们是不同的两个概念,职责也不一样。

session【session_state】

它被保存到浏览器的cookie中,有4个会话属性,这主要基于高低版本浏览器和记住我功能考虑而设计的

按着kc系统获取会话的优先级,他们分别是:【带_legacy是为了适应不支持samesite属性的浏览器】

  1. auth_session_id(支持samesite属性,会话级,关闭浏览器后过期)
  2. auth_session_id_legacy
  3. keycloak_session_id (开启了KEYCLOAK_REMEMBER_ME后,设置了过期时间,会在cookie添加这个属性)
  4. keycloak_session_id_legacy

会话与浏览器cookie里设计的过期时间有关,与token过期时间无关,当用户退出时,kc服务器保持的会话【session_state】会被删除,如图为kc用户的会话列表

token

由于kc中使用的是jwt(json web token),所以我们不需要把它再次进行存储了,因为在这个token里已经有了用户信息,并且添加了当前会话信息;而传统的而自解释
的token,往往需要把它与当前用户作一个对应关系,缓存起来,这点kc的jwt不需要存储。

一 根据职责,设置时长

  • access_token 较短的有效期,如30分钟,jwt的token中,会有用户认证和授权的信息
  • refresh_token 较长的有效期,用户最长可接受的,从新登录的时间,如10天

二 token的验证

  • 在线验证: 为认证服务器压力比较大,相当于去中心化校验,因为kc存储了session_state,可以更准确的知道这个token是否在线
  • 离线验证:各个服务端【对接到KC上的客户端】,通过kc颁发的公钥,对token进行签名验证,它可以验证出token是否由当前KC颁发的,对于在线性,它无法直接验证,当然,客户端自己也可以保留session_state,相当于分担KC的在线验证的压力
    • 离线验证的属性至少要包括
      • iss,token的颁发机构
      • exp,token的过期时间
      • 如果希望验证实时在线性,那你至少要维护session_state与token的关系,用户主动退出,需要清除它的关系
  • /auth/realms/lind 来查看iss颁发的分钥信息
{
    "realm":"lind",
    "public_key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyOCNCy8x",
    "token-service":"https://kc.com/auth/realms/fabao/protocol/openid-connect",
    "account-service":"https://kc.com/auth/realms/fabao/account",
    "tokens-not-before":1670507855
}

三 refresh_token使用方式
refresh_token去刷新token的方式方法,往往争论不休,业界的做法也是多种多样,其中使用最多的,还是在前端添加轮训操作,定时去通过refresh_token去换新的access_token

  refreshToken() {
      this.refreshTime = setInterval(() => {
        checkToken(this.refreshLock, this.$store)
      }, 60000)
    }

有关keycloak~再说session和token的更多相关文章

  1. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  2. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  3. ruby-on-rails - Rails 优雅地处理超时 session ? - 2

    使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p

  4. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  5. ruby-on-rails - 使用 HTTP.get_response 检索 Facebook 访问 token 时出现 Rails EOF 错误 - 2

    我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token

  6. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

  7. ruby - token 认证 - 2

    简单代码require'net/http'url=URI.parse('getjson/otherdatahere[link]')req=Net::HTTP::Get.new(url.to_s)res=Net::HTTP.start(url.host,url.port){|http|http.request(req)}putsres.body只是想知道如何在phpcURL中放置身份验证token,我是这样做的    curl_setopt($ch,CURLOPT_HTTPHEADER,array('Authorization:Bearerxxx'));//Bearertokenfora

  8. ruby - Sinatra session 未按预期持续 - 2

    我正在尝试使用Sinatra中的重定向和session在网站周围传递一些数据。这是一个简化的示例,使用PrettyPrint进行调试:require'pp'require'rubygems'require'sinatra'enable:sessionsget'/'dosession[:foo]='12345'puts'session1'ppsessionredirectto('/redir')endget'/redir'doputs'session2'ppsession'helloworld'end查看Thin的输出,我看到:>>Listeningon0.0.0.0:4567,CTRL

  9. ruby-on-rails - 访问授权和访问 token 之间的区别 - 2

    Doorkeeper中Token和Grant的区别我搞不清楚。Doorkeeper在哪个时刻创建访问授权,何时创建访问token?文档似乎对此什么也没说,现在我正在阅读代码,但不是十几行。 最佳答案 我还建议阅读documentationofoauth2据我了解,Doorkeeper也是基于该文档中描述的协议(protocol)。在doorkeeper中,你会先获得accessgrant,然后是accesstoken。访问授权通常只存在很短的时间(doorkeeper中的默认值为10分钟)。您将通过向api-url/oauth/au

  10. ruby - 如何强制 Rack :session + sinatra to read "rack.session" from params instead of cookies - 2

    我正在处理oauth1.0(twitter和flickr)。网站工作在80端口,oauth服务器工作在8080端口算法:向oauth服务器发送ajax请求以检查用户是否有有效的access_token如果用户没有access_token或access_token已过期,则打开授权窗口在oauth服务器的用户session中保存access_token发送分享数据到oauth服务器它使用sinatra+rack:session+rack::session::sequel+sqlite来存储session。它在每个响应中发送Set-Cookie:rack.session=id我正在使用2种

随机推荐