<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Stroom – token</title>
    <link>/tags/token/</link>
    <description>Recent content in token on Stroom</description>
    <generator>Hugo -- gohugo.io</generator>
    <lastBuildDate>Wed, 23 Sep 2026 00:00:00 +0000</lastBuildDate>
    
	  <atom:link href="/tags/token/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: Sessions and Tokens</title>
      <link>/docs/user-guide/security/sessions-and-tokens/</link>
      <pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate>
      
      <guid>/docs/user-guide/security/sessions-and-tokens/</guid>
      <description>
        
        
        &lt;p&gt;Signing in to Stroom creates a session, and Stroom issues tokens that are used to prove who a user is, both to Stroom itself and between the nodes of a cluster.
This page describes how sessions and tokens are ended, both by users for themselves and by administrators.&lt;/p&gt;
&lt;h2 id=&#34;ending-your-own-sessions&#34;&gt;Ending Your Own Sessions&lt;/h2&gt;
&lt;p&gt;Any user can end their own sessions other than the one they are currently using, by selecting&lt;/p&gt;





  &lt;div class=&#34;stroom-theme-dark stroom-menu&#34;&gt;
    
    

      

      
      


      

  
  
  &lt;div class=&#34;stroom-menu-item-background&#34; style=&#34;margin-top: 0px;&#34;&gt;
    
    &lt;div class=&#34;stroom-menu-item &#34; &gt;

      &lt;div class=&#34;stroom-menu-item-text&#34;&gt;User
      &lt;/div&gt;
        &lt;div class=&#34;stroom-menu-item-arrow&#34;&gt;
          &lt;span class=&#34;stroom-icon inline-svg-button icon-button  &#34; &gt;
    &lt;span class=&#34;face&#34; title=&#34;Arrow right&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;1427.7665&#34; height=&#34;1427.7665&#34; viewBox=&#34;0 0 1427.7665 1427.7665&#34;&gt;&lt;g style=&#34;stroke:currentColor;stroke-width:167.567&#34;&gt;&lt;path d=&#34;m 415.05387,83.70929 c -39.92654,0.4303 -75.41463,48.3887 -40.0468,81.9121 C 567.552,348.69899 760.75555,531.15431 953.73208,713.82391 760.75555,896.49341 567.552,1078.9486 375.00707,1262.0262 c -46.19471,43.7855 28.48812,112.1966 76.0571,67.1681 195.93558,-185.823 392.95261,-370.82479 587.98693,-557.52749 5.6117,-4.8034 10.4633,-10.2473 14.4855,-16.1231 9.643,-12.4844 13.9638,-27.0796 13.6909,-41.7198 0.2729,-14.6402 -4.0479,-29.2354 -13.6909,-41.7198 -4.0222,-5.8758 -8.8738,-11.3198 -14.4855,-16.1231 C 844.01678,469.27821 646.99975,284.27629 451.06417,98.45319 439.91519,87.89979 427.27628,83.57749 415.05387,83.70929 Z&#34;/&gt;&lt;/g&gt;&lt;/svg&gt; &lt;/span&gt;
  &lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

      

      
      
        
      


      

  
  
  &lt;div class=&#34;stroom-menu-item-background&#34; style=&#34;margin-top: 7px;&#34;&gt;
    
    &lt;div class=&#34;stroom-menu-item stroom-menu-item-leaf&#34; &gt;

      &lt;div class=&#34;stroom-menu-item-text&#34;&gt;Sign Out Other Sessions
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;/div&gt;



&lt;p&gt;from the main menu.&lt;/p&gt;
&lt;p&gt;This is useful after signing in from a machine that is no longer under their control.
It applies across every browser and device, and across every node in the cluster.&lt;/p&gt;
&lt;p&gt;Completing a password reset also ends all of that user&amp;rsquo;s sessions, including the one being used at the time.
See &lt;a href=&#34;../../docs/user-guide/security/signing-in/&#34;&gt;Signing In&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-user-access-screen&#34;&gt;The User Access Screen&lt;/h2&gt;
&lt;p&gt;A user holding the &lt;code&gt;Manage Users&lt;/code&gt; or &lt;code&gt;Administrator&lt;/code&gt; &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/a/glossary-application-permission&#34;&gt;
      &lt;span&gt;Application permission&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Application permission&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;This is a permission that is not specific to a single document. It applies to all documents or is not related to documents in any way.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; can see and end the access held by other users by selecting&lt;/p&gt;





  &lt;div class=&#34;stroom-theme-dark stroom-menu&#34;&gt;
    
    

      

      
      


      

  
  
  &lt;div class=&#34;stroom-menu-item-background&#34; style=&#34;margin-top: 0px;&#34;&gt;
    
    &lt;div class=&#34;stroom-menu-item &#34; &gt;

      &lt;div class=&#34;stroom-menu-item-text&#34;&gt;Security
      &lt;/div&gt;
        &lt;div class=&#34;stroom-menu-item-arrow&#34;&gt;
          &lt;span class=&#34;stroom-icon inline-svg-button icon-button  &#34; &gt;
    &lt;span class=&#34;face&#34; title=&#34;Arrow right&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;1427.7665&#34; height=&#34;1427.7665&#34; viewBox=&#34;0 0 1427.7665 1427.7665&#34;&gt;&lt;g style=&#34;stroke:currentColor;stroke-width:167.567&#34;&gt;&lt;path d=&#34;m 415.05387,83.70929 c -39.92654,0.4303 -75.41463,48.3887 -40.0468,81.9121 C 567.552,348.69899 760.75555,531.15431 953.73208,713.82391 760.75555,896.49341 567.552,1078.9486 375.00707,1262.0262 c -46.19471,43.7855 28.48812,112.1966 76.0571,67.1681 195.93558,-185.823 392.95261,-370.82479 587.98693,-557.52749 5.6117,-4.8034 10.4633,-10.2473 14.4855,-16.1231 9.643,-12.4844 13.9638,-27.0796 13.6909,-41.7198 0.2729,-14.6402 -4.0479,-29.2354 -13.6909,-41.7198 -4.0222,-5.8758 -8.8738,-11.3198 -14.4855,-16.1231 C 844.01678,469.27821 646.99975,284.27629 451.06417,98.45319 439.91519,87.89979 427.27628,83.57749 415.05387,83.70929 Z&#34;/&gt;&lt;/g&gt;&lt;/svg&gt; &lt;/span&gt;
  &lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

      

      
      
        
      


      

  
  
  &lt;div class=&#34;stroom-menu-item-background&#34; style=&#34;margin-top: 7px;&#34;&gt;
    
    &lt;div class=&#34;stroom-menu-item stroom-menu-item-leaf&#34; &gt;

      &lt;div class=&#34;stroom-menu-item-text&#34;&gt;User Access
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;/div&gt;



&lt;p&gt;from the main menu.&lt;/p&gt;
&lt;p&gt;The screen lists users along with how many sessions and tokens each currently holds, and shows the sessions held for the selected user across every node in the cluster.&lt;/p&gt;
&lt;p&gt;Two actions are available.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;End this user&amp;rsquo;s sessions and revoke their tokens&lt;/em&gt; does exactly that, across the whole cluster rather than just the node serving the request.
It does not withdraw their access: the account is untouched and they can sign in again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Open this user&lt;/em&gt; opens the selected user, where they can be disabled.
This is offered alongside revocation because the two are easily confused and do quite different things, as described below.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;revoking-disabling-and-the-difference-between-them&#34;&gt;Revoking, Disabling, and the Difference between Them&lt;/h2&gt;
&lt;p&gt;Three actions are easy to confuse, and each does something different.
To stop someone using Stroom completely and immediately, you need the last two together.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Ends sessions and tokens&lt;/th&gt;
&lt;th&gt;Prevents signing in again&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;End sessions and revoke tokens&lt;/em&gt;, on the User Access screen&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disable the Stroom &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/u/glossary-user&#34;&gt;
      &lt;span&gt;User&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;User&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;Refers to a Stroom User that is linked to either an &lt;em&gt;Account&lt;/em&gt; in Stroom&amp;rsquo;s internal &lt;em&gt;Identity Provider&lt;/em&gt; or a user account in an external &lt;em&gt;Identity Provider&lt;/em&gt;. A Stroom User is primarily concerned with authorisation (i.e. application/document permissions and group memberships) rather than authentication, though disabling one also refuses that person at authentication and ends any access they currently hold.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, on the Users screen&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disable the account, on the Manage Accounts screen&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ending sessions and revoking tokens does both of those things and no more.
It deliberately leaves the account alone, so the password still works and the user can sign in again.
Every token revoked this way is dead permanently, but their access as a whole is not withdrawn.
It forces re-authentication rather than shutting anybody out, which makes it the right action when you want to be certain that whoever is currently signed in has to prove who they are again.&lt;/p&gt;
&lt;p&gt;Disabling the Stroom &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/u/glossary-user&#34;&gt;
      &lt;span&gt;User&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;User&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;Refers to a Stroom User that is linked to either an &lt;em&gt;Account&lt;/em&gt; in Stroom&amp;rsquo;s internal &lt;em&gt;Identity Provider&lt;/em&gt; or a user account in an external &lt;em&gt;Identity Provider&lt;/em&gt;. A Stroom User is primarily concerned with authorisation (i.e. application/document permissions and group memberships) rather than authentication, though disabling one also refuses that person at authentication and ends any access they currently hold.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; does everything the above does, and additionally refuses them at authentication, whether they are signing in interactively or presenting a token.
This is the action to take when someone must be stopped, and is what the &lt;em&gt;Open this user&lt;/em&gt; button on the User Access screen is for.&lt;/p&gt;
&lt;p&gt;Disabling the account, which only applies when Stroom is its own &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/i/glossary-idp&#34;&gt;
      &lt;span&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;An &lt;strong&gt;Id&lt;/strong&gt;entity &lt;strong&gt;P&lt;/strong&gt;rovider is a system or service that can authenticate a user and assert their identity. &lt;em&gt;Identity providers&lt;/em&gt; can support single sign on (SSO), which allows the user to sign in once to the &lt;em&gt;Identity Provider&lt;/em&gt; so they are then authenticated to all systems using that IDP.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, stops them authenticating at all.
It does not disturb a session that is already running.
See &lt;a href=&#34;../../docs/user-guide/security/user-accounts/&#34;&gt;User Accounts&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;


    &lt;p&gt;This matters most when Stroom is configured to use an external &lt;span class=&#34;glossary-link&#34;&gt;
&lt;a href=&#34;../../docs/glossary/i/glossary-idp&#34;&gt;
&lt;span&gt;Identity Provider (IDP)&lt;/span&gt;
&lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
&lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
&lt;span class=&#34;glossary-tooltip-title&#34;&gt;Identity Provider (IDP)&lt;/span&gt;
&lt;span class=&#34;glossary-tooltip-summary&#34;&gt;An &lt;strong&gt;Id&lt;/strong&gt;entity &lt;strong&gt;P&lt;/strong&gt;rovider is a system or service that can authenticate a user and assert their identity. &lt;em&gt;Identity providers&lt;/em&gt; can support single sign on (SSO), which allows the user to sign in once to the &lt;em&gt;Identity Provider&lt;/em&gt; so they are then authenticated to all systems using that IDP.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.
Revoking a user’s sessions and tokens does not touch the session they hold with that provider, so their next request is likely to sign them straight back in automatically, without their even being asked for a password.&lt;/p&gt;
&lt;p&gt;To prevent access when using an external &lt;span class=&#34;glossary-link&#34;&gt;
&lt;a href=&#34;../../docs/glossary/i/glossary-idp&#34;&gt;
&lt;span&gt;Identity Provider (IDP)&lt;/span&gt;
&lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
&lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
&lt;span class=&#34;glossary-tooltip-title&#34;&gt;Identity Provider (IDP)&lt;/span&gt;
&lt;span class=&#34;glossary-tooltip-summary&#34;&gt;An &lt;strong&gt;Id&lt;/strong&gt;entity &lt;strong&gt;P&lt;/strong&gt;rovider is a system or service that can authenticate a user and assert their identity. &lt;em&gt;Identity providers&lt;/em&gt; can support single sign on (SSO), which allows the user to sign in once to the &lt;em&gt;Identity Provider&lt;/em&gt; so they are then authenticated to all systems using that IDP.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, disable the account at that provider, in Stroom, or both.&lt;/p&gt;


&lt;/div&gt;


&lt;h2 id=&#34;token-lifetimes&#34;&gt;Token Lifetimes&lt;/h2&gt;
&lt;p&gt;These are the defaults, and are configurable under &lt;code&gt;stroom.security.identity.token.&lt;/code&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Access token&lt;/td&gt;
&lt;td&gt;&lt;code&gt;accessTokenExpiration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refresh token&lt;/td&gt;
&lt;td&gt;&lt;code&gt;refreshTokenExpiration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password reset link&lt;/td&gt;
&lt;td&gt;&lt;code&gt;emailResetTokenExpiration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;defaultApiKeyExpiration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;365 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Refresh tokens can be used only once, and each use issues a replacement.
If a refresh token is presented a second time, which suggests it has been copied, Stroom withdraws that token and every token descended from it.&lt;/p&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;See Also&lt;/h4&gt;
&lt;div class=&#34;alert-content&#34;&gt;
  
  &lt;p&gt;&lt;a href=&#34;../../docs/user-guide/security/user-accounts/&#34;&gt;User Accounts&lt;/a&gt;
&lt;a href=&#34;../../docs/user-guide/security/signing-in/&#34;&gt;Signing In&lt;/a&gt;
&lt;a href=&#34;../../docs/user-guide/security/signing-keys/&#34;&gt;Signing Keys&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;


      </description>
    </item>
    
    <item>
      <title>Docs: Signing Keys</title>
      <link>/docs/user-guide/security/signing-keys/</link>
      <pubDate>Wed, 29 Jul 2026 00:00:00 +0000</pubDate>
      
      <guid>/docs/user-guide/security/signing-keys/</guid>
      <description>
        
        
        &lt;p&gt;When Stroom acts as its own &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/i/glossary-idp&#34;&gt;
      &lt;span&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;An &lt;strong&gt;Id&lt;/strong&gt;entity &lt;strong&gt;P&lt;/strong&gt;rovider is a system or service that can authenticate a user and assert their identity. &lt;em&gt;Identity providers&lt;/em&gt; can support single sign on (SSO), which allows the user to sign in once to the &lt;em&gt;Identity Provider&lt;/em&gt; so they are then authenticated to all systems using that IDP.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; it signs the tokens it issues with a key that it creates and replaces by itself.
Nodes and Stroom-Proxy check that signature to satisfy themselves that a token really came from Stroom.&lt;/p&gt;
&lt;p&gt;This screen exists so that a key believed to have been exposed can be withdrawn.
It is not needed for day to day running, because keys are replaced automatically.&lt;/p&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;



    &lt;p&gt;This screen requires the &lt;code&gt;Administrator&lt;/code&gt; &lt;span class=&#34;glossary-link&#34;&gt;
&lt;a href=&#34;../../docs/glossary/a/glossary-application-permission&#34;&gt;
&lt;span&gt;Application permission&lt;/span&gt;
&lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
&lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
&lt;span class=&#34;glossary-tooltip-title&#34;&gt;Application permission&lt;/span&gt;
&lt;span class=&#34;glossary-tooltip-summary&#34;&gt;This is a permission that is not specific to a single document. It applies to all documents or is not related to documents in any way.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details…&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, rather than &lt;code&gt;Manage Users&lt;/code&gt; which is enough for most other security screens.
Withdrawing a signing key affects everybody using Stroom at once, so it is treated as an application wide action.&lt;/p&gt;


&lt;/div&gt;


&lt;p&gt;Reach the screen by selecting&lt;/p&gt;





  &lt;div class=&#34;stroom-theme-dark stroom-menu&#34;&gt;
    
    

      

      
      


      

  
  
  &lt;div class=&#34;stroom-menu-item-background&#34; style=&#34;margin-top: 0px;&#34;&gt;
    
    &lt;div class=&#34;stroom-menu-item &#34; &gt;

      &lt;div class=&#34;stroom-menu-item-text&#34;&gt;Security
      &lt;/div&gt;
        &lt;div class=&#34;stroom-menu-item-arrow&#34;&gt;
          &lt;span class=&#34;stroom-icon inline-svg-button icon-button  &#34; &gt;
    &lt;span class=&#34;face&#34; title=&#34;Arrow right&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; width=&#34;1427.7665&#34; height=&#34;1427.7665&#34; viewBox=&#34;0 0 1427.7665 1427.7665&#34;&gt;&lt;g style=&#34;stroke:currentColor;stroke-width:167.567&#34;&gt;&lt;path d=&#34;m 415.05387,83.70929 c -39.92654,0.4303 -75.41463,48.3887 -40.0468,81.9121 C 567.552,348.69899 760.75555,531.15431 953.73208,713.82391 760.75555,896.49341 567.552,1078.9486 375.00707,1262.0262 c -46.19471,43.7855 28.48812,112.1966 76.0571,67.1681 195.93558,-185.823 392.95261,-370.82479 587.98693,-557.52749 5.6117,-4.8034 10.4633,-10.2473 14.4855,-16.1231 9.643,-12.4844 13.9638,-27.0796 13.6909,-41.7198 0.2729,-14.6402 -4.0479,-29.2354 -13.6909,-41.7198 -4.0222,-5.8758 -8.8738,-11.3198 -14.4855,-16.1231 C 844.01678,469.27821 646.99975,284.27629 451.06417,98.45319 439.91519,87.89979 427.27628,83.57749 415.05387,83.70929 Z&#34;/&gt;&lt;/g&gt;&lt;/svg&gt; &lt;/span&gt;
  &lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;

      

      
      
        
      


      

  
  
  &lt;div class=&#34;stroom-menu-item-background&#34; style=&#34;margin-top: 7px;&#34;&gt;
    
    &lt;div class=&#34;stroom-menu-item stroom-menu-item-leaf&#34; &gt;

      &lt;div class=&#34;stroom-menu-item-text&#34;&gt;Signing Keys
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;/div&gt;



&lt;p&gt;from the main menu.&lt;/p&gt;
&lt;h2 id=&#34;what-the-screen-shows&#34;&gt;What the Screen Shows&lt;/h2&gt;
&lt;p&gt;Each key is listed with its status and the date it was issued, and nothing else.
Nothing that identifies a key or describes its contents is shown, because the stored key includes the private half that produces signatures.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Active&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;New tokens are being signed with this key.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Retired&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;No longer signing new tokens, but still trusted so that tokens already issued keep working. Shown with the date that trust ends.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Expired&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;No longer trusted. Removed automatically shortly afterwards.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Revoked&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Withdrawn by an administrator. Anything signed with it is already refused.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The active key has no end date.
Keys here do not expire on a schedule.
Rotation replaces the active key when it is old enough, and only at that point does the key it replaced gain a date on which it stops being trusted.&lt;/p&gt;
&lt;h2 id=&#34;automatic-rotation&#34;&gt;Automatic Rotation&lt;/h2&gt;
&lt;p&gt;Stroom replaces the active signing key every &lt;code&gt;stroom.security.identity.token.jwkRotationInterval&lt;/code&gt;, which is thirty days by default.&lt;/p&gt;
&lt;p&gt;Rotation is invisible to users.
The key being replaced continues to be trusted for long enough that every token already signed with it expires naturally, so nobody is signed out and nothing needs to be restarted.&lt;/p&gt;
&lt;h2 id=&#34;revoking-a-key&#34;&gt;Revoking a Key&lt;/h2&gt;
&lt;p&gt;Revoking withdraws a key immediately.
Any token signed with it stops being accepted, and a replacement signing key is created at the same moment so that Stroom can carry on issuing tokens.&lt;/p&gt;
&lt;p&gt;There are two actions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Revoke&lt;/em&gt; withdraws the selected key.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Revoke all&lt;/em&gt; withdraws every key that is still trusted, for when a key is believed to have been exposed but it is not known which.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both actions ask for confirmation first, and the confirmation says what that particular key will cost, because the effect differs enormously between them.
Revoking a retired key usually affects a handful of people, while revoking the active key affects everyone.&lt;/p&gt;

&lt;div class=&#34;alert alert-warning&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Warning&lt;/h4&gt;

    &lt;p&gt;Revoking cannot be undone.
There is no way to restore trust in a key that has been withdrawn.&lt;/p&gt;
&lt;p&gt;Revoke a key only if you believe it may have been exposed.
A key revoked by mistake costs everybody a fresh sign in, but no data is lost.&lt;/p&gt;


&lt;/div&gt;


&lt;h3 id=&#34;what-to-expect-after-revoking-the-active-key&#34;&gt;What to Expect after Revoking the Active Key&lt;/h3&gt;
&lt;p&gt;Everybody using Stroom is signed out and must authenticate again.
For people at a browser this is quick, and they will be signed back in as soon as they do so.&lt;/p&gt;
&lt;p&gt;Nodes and Stroom-Proxy hold their own tokens signed with the same key, and they replace those tokens as they expire rather than immediately.
Parts of the cluster may therefore be unable to talk to one another for up to ten minutes.
This resolves itself and needs no intervention, but it is worth expecting rather than being surprised by, and it is a good reason to reserve this action for a suspected compromise.&lt;/p&gt;
&lt;p&gt;Revoking a retired or expired key has no such effect, as nothing is signing with it.&lt;/p&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;See Also&lt;/h4&gt;
&lt;div class=&#34;alert-content&#34;&gt;
  
  &lt;p&gt;&lt;a href=&#34;../../docs/user-guide/security/sessions-and-tokens/&#34;&gt;Sessions and Tokens&lt;/a&gt;
&lt;a href=&#34;../../docs/install-guide/setup/open-id/internal-idp/&#34;&gt;Internal IDP&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;


      </description>
    </item>
    
    <item>
      <title>Docs: Tokens for API use</title>
      <link>/docs/install-guide/setup/open-id/tokens-for-api/</link>
      <pubDate>Fri, 25 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>/docs/install-guide/setup/open-id/tokens-for-api/</guid>
      <description>
        
        
        
&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;



    &lt;p&gt;We strongly recommend you install &lt;em&gt;jq&lt;/em&gt; if you are working with JSON responses from the IDP.
It allows you to parse and extract parts of the JSON response.
&lt;span class=&#34;external-link&#34;&gt;
&lt;a href=&#34;https://stedolan.github.io/jq/&#34; target=&#34;_blank&#34; class=&#34;external-link&#34; title=&#34;External link to https://stedolan.github.io/jq/&#34;&gt;
&lt;span&gt;&lt;a href=&#34;https://stedolan.github.io/jq/&#34;&gt;https://stedolan.github.io/jq/&lt;/a&gt;&lt;/span&gt;
&lt;i class=&#34;external-link-icon fas fa-external-link-alt fa-sm text-secondary&#34;&gt;&lt;/i&gt;
&lt;/a&gt;
&lt;/span&gt;&lt;/p&gt;


&lt;/div&gt;


&lt;h2 id=&#34;creating-a-user-access-token&#34;&gt;Creating a User Access Token&lt;/h2&gt;
&lt;p&gt;If a user wants to use the REST API they will need to create a token for authentication/authorisation in API calls.
Any calls to the REST API will have the same permissions that the user has within Stroom.&lt;/p&gt;
&lt;p&gt;The following excerpt of shell commands shows how you can get an access/refresh token pair for a user and then later use the refresh token to obtain a new access token.
It also shows how you can extract the expiry date/time from a token using &lt;em&gt;jq&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;get_jwt_expiry() {
  jq \
    --raw-input \
    --raw-output \
    &#39;split(&amp;quot;.&amp;quot;) | .[1] | @base64d | fromjson | .exp | todateiso8601&#39; \
    &amp;lt;&amp;lt;&amp;lt; &amp;quot;${1}&amp;quot;
}

# Fetch a new set of tokens (id, access and refresh) for the user
response=&amp;quot;$( \
  curl \
    --silent \
    --request POST \
    --header &#39;Content-Type: application/x-www-form-urlencoded&#39; \
    --data-urlencode &#39;client_id=admin-cli&#39; \
    --data-urlencode &#39;grant_type=password&#39; \
    --data-urlencode &#39;scope=openid&#39; \
    --data-urlencode &#39;username=jbloggs&#39; \
    --data-urlencode &#39;password=password&#39; \
    &#39;http://localhost:9999/realms/StroomRealm/protocol/openid-connect/token&#39; )&amp;quot;

# Extract the individual tokens from the response
access_token=&amp;quot;$( jq -r &#39;.access_token&#39; &amp;lt;&amp;lt;&amp;lt; &amp;quot;${response}&amp;quot; )&amp;quot;
refresh_token=&amp;quot;$( jq -r &#39;.refresh_token&#39; &amp;lt;&amp;lt;&amp;lt; &amp;quot;${response}&amp;quot; )&amp;quot;

# Output the tokens
echo -e &amp;quot;\nAccess token (expiry $( get_jwt_expiry &amp;quot;${access_token}&amp;quot;)):\n${access_token}&amp;quot;
echo -e &amp;quot;\nRefresh token (expiry $( get_jwt_expiry &amp;quot;${refresh_token}&amp;quot;)):\n${refresh_token}&amp;quot;

# Fetch a new access token using the stored refresh token
response=&amp;quot;$( \
  curl \
    --silent \
    --request POST \
    --header &#39;Content-Type: application/x-www-form-urlencoded&#39; \
    --data-urlencode &#39;client_id=admin-cli&#39; \
    --data-urlencode &#39;grant_type=refresh_token&#39; \
    --data-urlencode &amp;quot;refresh_token=${refresh_token}&amp;quot; \
    &#39;http://localhost:9999/realms/StroomRealm/protocol/openid-connect/token&#39; )&amp;quot;

access_token=&amp;quot;$( jq -r &#39;.access_token&#39; &amp;lt;&amp;lt;&amp;lt; &amp;quot;${response}&amp;quot; )&amp;quot;
refresh_token=&amp;quot;$( jq -r &#39;.refresh_token&#39; &amp;lt;&amp;lt;&amp;lt; &amp;quot;${response}&amp;quot; )&amp;quot;

echo -e &amp;quot;\nNew access token (expiry $( get_jwt_expiry &amp;quot;${access_token}&amp;quot;)):\n${access_token}&amp;quot;
echo -e &amp;quot;\nNew refresh token (expiry $( get_jwt_expiry &amp;quot;${refresh_token}&amp;quot;)):\n${refresh_token}&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The above example assumes that you have created a user called &lt;code&gt;jbloggs&lt;/code&gt; and a client ID &lt;code&gt;admin-cli&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Access tokens typically have a short life (of the order of minutes) while a refresh token will have a much longer life (maybe up to a year).
Refreshing the token does not require re-authentication.&lt;/p&gt;
&lt;h2 id=&#34;creating-a-service-account-token&#34;&gt;Creating a Service Account Token&lt;/h2&gt;
&lt;p&gt;If you want another system to call one of Stroom&amp;rsquo;s APIs then it is likely that you will do that using a non-human service account (or processing user account).&lt;/p&gt;
&lt;h3 id=&#34;creating-a-new-client-id&#34;&gt;Creating a New Client ID&lt;/h3&gt;
&lt;p&gt;The client system needs to be represented by a Client ID in KeyCloak.
To create a new Client ID, assuming the client system is called &lt;em&gt;System X&lt;/em&gt;, do the following in the KeyCloak admin UI.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click &lt;em&gt;Clients&lt;/em&gt; in the left pane.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Create client&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Set the &lt;em&gt;Client ID&lt;/em&gt; to be &lt;code&gt;system-x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set the &lt;em&gt;Name&lt;/em&gt; to be &lt;code&gt;System X&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Next&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Enable &lt;em&gt;Client Authentication&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Enable &lt;em&gt;Service accounts roles&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;em&gt;Save&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;Note&lt;/h4&gt;


    By enabling &lt;em&gt;Service accounts role&lt;/em&gt;, KeyCloak will create a service account user called &lt;code&gt;service-account-system-x&lt;/code&gt;.
Tokens will be created under this non-human user identity.

&lt;/div&gt;


&lt;p&gt;Open the &lt;em&gt;Credentials&lt;/em&gt; tab and copy the &lt;em&gt;Client secret&lt;/em&gt; for use later.&lt;/p&gt;
&lt;p&gt;To create an access token run the following shell commands:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;response=&amp;quot;$( \
  curl \
    --silent \
    --request POST \
    --header &#39;Content-Type: application/x-www-form-urlencoded&#39; \
    --data-urlencode &#39;client_secret=k0BhYyvt6PHQqwKnnQpbL3KXVFHG0Wa1&#39; \
    --data-urlencode &#39;client_id=system-x&#39; \
    --data-urlencode &#39;grant_type=client_credentials&#39; \
    --data-urlencode &#39;scope=openid&#39; \
    &#39;http://localhost:9999/realms/StroomRealm/protocol/openid-connect/token&#39; )&amp;quot;

access_token=&amp;quot;$( jq -r &#39;.access_token&#39; &amp;lt;&amp;lt;&amp;lt; &amp;quot;${response}&amp;quot; )&amp;quot;
refresh_token=&amp;quot;$( jq -r &#39;.refresh_token&#39; &amp;lt;&amp;lt;&amp;lt; &amp;quot;${response}&amp;quot; )&amp;quot;

echo -e &amp;quot;\nAccess token:\n${access_token}&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Where &lt;code&gt;client_secret&lt;/code&gt; is the &lt;em&gt;Client secret&lt;/em&gt; that you copied from KeyCloak earlier.&lt;/p&gt;
&lt;p&gt;This access token can be refreshed in the same way as for a user access token, as described above.&lt;/p&gt;
&lt;h2 id=&#34;using-access-tokens&#34;&gt;Using Access Tokens&lt;/h2&gt;
&lt;p&gt;Access tokens can be used in calls to Stroom&amp;rsquo;s REST API or its datafeed API.
The process of including the token in a HTTP request is described in &lt;a href=&#34;../../docs/user-guide/api/#authentication&#34;&gt;API Authentication&lt;/a&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: API Key Authentication</title>
      <link>/docs/sending-data/api-key-authentication/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>/docs/sending-data/api-key-authentication/</guid>
      <description>
        
        
        &lt;p&gt;As an alternative to a &lt;a href=&#34;../../docs/sending-data/ssl/&#34;&gt;certificate&lt;/a&gt; or an &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/i/glossary-idp&#34;&gt;
      &lt;span&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;An &lt;strong&gt;Id&lt;/strong&gt;entity &lt;strong&gt;P&lt;/strong&gt;rovider is a system or service that can authenticate a user and assert their identity. &lt;em&gt;Identity providers&lt;/em&gt; can support single sign on (SSO), which allows the user to sign in once to the &lt;em&gt;Identity Provider&lt;/em&gt; so they are then authenticated to all systems using that IDP.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;a href=&#34;../../docs/sending-data/token-authentication/&#34;&gt;token&lt;/a&gt;, data can be sent to the &lt;code&gt;/datafeed&lt;/code&gt; endpoint using an &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/a/glossary-api-key&#34;&gt;
      &lt;span&gt;API Key&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;API Key&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;&lt;em&gt;API Keys&lt;/em&gt; are a form of authentication token that are created within Stroom for use by Stroom-Proxy instances or other clients that want to use Stroom&amp;rsquo;s &lt;em&gt;API&lt;/em&gt;. It is an encrypted string that contains details of the user and the expiration date of the token. Possession of a valid API Key for a user account means that you can do anything that the user can do in the user interface via the API.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; created within Stroom.&lt;/p&gt;
&lt;p&gt;An API Key belongs to a Stroom user, and carries that user&amp;rsquo;s permissions, so it should be protected as carefully as a password.
Create one as described in &lt;a href=&#34;../../docs/user-guide/api/calling-api/#authentication&#34;&gt;Calling the API&lt;/a&gt;, then attach it to the request with the &lt;a href=&#34;../../docs/sending-data/header-arguments/&#34;&gt;HTTP header&lt;/a&gt; &lt;code&gt;Authorization&lt;/code&gt;, exactly as a token would be:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;Bearer YOUR_API_KEY_GOES_HERE
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;API Keys have the form &lt;code&gt;sak_&amp;lt;hash&amp;gt;_&amp;lt;random&amp;gt;&lt;/code&gt;, and it is that &lt;code&gt;sak_&lt;/code&gt; prefix that lets Stroom-Proxy tell them apart from &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/i/glossary-idp&#34;&gt;
      &lt;span&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;An &lt;strong&gt;Id&lt;/strong&gt;entity &lt;strong&gt;P&lt;/strong&gt;rovider is a system or service that can authenticate a user and assert their identity. &lt;em&gt;Identity providers&lt;/em&gt; can support single sign on (SSO), which allows the user to sign in once to the &lt;em&gt;Identity Provider&lt;/em&gt; so they are then authenticated to all systems using that IDP.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; tokens arriving in the same header.&lt;/p&gt;
&lt;h2 id=&#34;the-flow&#34;&gt;The Flow&lt;/h2&gt;
&lt;p&gt;Stroom can check an API Key against its own records.
Stroom-Proxy holds no user accounts, so it asks its downstream Stroom, or the next Stroom-Proxy in the chain, and caches the answer.&lt;/p&gt;







  
  
  
  
  







  



&lt;div class=&#34;card rounded shadow-stroom p-2 td-post-card mb-4 mt-4&#34; style=&#34;width: fit-content;&#34;&gt;

  &lt;a title=&#34;images/sending-data/api-key-authentication.puml.svg&#34; href=&#34;../../images/sending-data/api-key-authentication.puml.svg&#34;&gt;
    &lt;figure style=&#34;margin-block-end: 0px&#34; &gt;
      
      &lt;img class=&#34;card-img-top&#34; src=&#34;../../images/sending-data/api-key-authentication.puml.svg&#34; style=&#34;max-width: fit-content&#34; alt=&#34;images/sending-data/api-key-authentication.puml.svg&#34;&gt;
      

      
      &lt;div class=&#34;card-body px-0 pt-2 pb-0&#34;&gt;
        &lt;hr style=&#34;border-top: 1px solid #ddd; margin-top: 0px; margin-bottom:4px;&#34;&gt;
        &lt;figcaption class=&#34;card-text&#34; style=&#34;font-size: smaller; text-align: center;&#34;&gt;Sending data with an API Key&lt;/figcaption&gt;
      &lt;/div&gt;
      
    &lt;/figure&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Two consequences worth knowing when sending to a Stroom-Proxy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;first&lt;/strong&gt; request with a given key is slower than the rest, because it waits on the downstream call.
Afterwards the key is served from memory for &lt;code&gt;downstreamHost.maxCachedKeyAge&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A key that has been verified before goes on working through a downstream outage, because Stroom-Proxy falls back to its local file of verified keys, for as long as the entry there is younger than &lt;code&gt;downstreamHost.maxPersistedKeyAge&lt;/code&gt;.
That file survives a restart of the proxy.
A key used for the &lt;strong&gt;first&lt;/strong&gt; time during an outage cannot be verified and is refused, though it is not remembered as invalid and will be verified once the downstream returns.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;See Also&lt;/h4&gt;
&lt;div class=&#34;alert-content&#34;&gt;
  
  &lt;p&gt;See &lt;a href=&#34;../../docs/user-guide/data-receipt/data-feed-identities/&#34;&gt;Data Feed Identities&lt;/a&gt; for &lt;em&gt;Data Feed Keys&lt;/em&gt;, a similar credential that Stroom-Proxy can check locally with no downstream call, and which also sets meta data on the received data.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;


      </description>
    </item>
    
    <item>
      <title>Docs: Token Authentication</title>
      <link>/docs/sending-data/token-authentication/</link>
      <pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>/docs/sending-data/token-authentication/</guid>
      <description>
        
        
        &lt;p&gt;As an alternative to using SSL certificates or an &lt;a href=&#34;../../docs/sending-data/api-key-authentication/&#34;&gt;API Key&lt;/a&gt; for authentication when sending data to the &lt;code&gt;/datafeed&lt;/code&gt; endpoint, you can use a &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/t/glossary-token&#34;&gt;
      &lt;span&gt;JSON Web Token&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Token&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;Typically refers to an authentication token that may be used for user authentication. A Stroom &lt;em&gt;API Key&lt;/em&gt; is a form of authentication token.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;.
Using a token for authentication requires that Stroom or Stroom-Proxy have been configured with &lt;code&gt;identityProviderType&lt;/code&gt; set to &lt;code&gt;EXTERNAL_IDP&lt;/code&gt; (see &lt;a href=&#34;../../docs/install-guide/setup/open-id/external-idp/&#34;&gt;External IDP&lt;/a&gt; for details on the configuration for an external IDP and how to generate a token).&lt;/p&gt;
&lt;p&gt;To attach a token to the request you just need to set the &lt;a href=&#34;../../docs/sending-data/header-arguments/&#34;&gt;HTTP header&lt;/a&gt; &lt;code&gt;Authorization&lt;/code&gt; with a value of the form&lt;/p&gt;
&lt;pre&gt;&lt;code class=&#34;language-text&#34;&gt;Bearer YOUR_TOKEN_GOES_HERE
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;the-flow&#34;&gt;The Flow&lt;/h2&gt;
&lt;p&gt;The sending system obtains a token from the &lt;span class=&#34;glossary-link&#34;&gt;
    &lt;a href=&#34;../../docs/glossary/i/glossary-idp&#34;&gt;
      &lt;span&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;i class=&#34;glossary-link-icon fas fa-book fa-sm text-primary&#34;&gt;&lt;/i&gt;
    &lt;/a&gt;&lt;span class=&#34;glossary-tooltip&#34;&gt;
      &lt;span class=&#34;glossary-tooltip-title&#34;&gt;Identity Provider (IDP)&lt;/span&gt;
      &lt;span class=&#34;glossary-tooltip-summary&#34;&gt;An &lt;strong&gt;Id&lt;/strong&gt;entity &lt;strong&gt;P&lt;/strong&gt;rovider is a system or service that can authenticate a user and assert their identity. &lt;em&gt;Identity providers&lt;/em&gt; can support single sign on (SSO), which allows the user to sign in once to the &lt;em&gt;Identity Provider&lt;/em&gt; so they are then authenticated to all systems using that IDP.&lt;/span&gt;&lt;span class=&#34;glossary-tooltip-truncated&#34;&gt;Click to see more details...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; for its own identity, then presents it with each request.
Stroom or Stroom-Proxy verifies that token against the IDP&amp;rsquo;s published signing keys, exactly as it would verify any other bearer token.&lt;/p&gt;







  
  
  
  
  







  



&lt;div class=&#34;card rounded shadow-stroom p-2 td-post-card mb-4 mt-4&#34; style=&#34;width: fit-content;&#34;&gt;

  &lt;a title=&#34;images/sending-data/token-authentication.puml.svg&#34; href=&#34;../../images/sending-data/token-authentication.puml.svg&#34;&gt;
    &lt;figure style=&#34;margin-block-end: 0px&#34; &gt;
      
      &lt;img class=&#34;card-img-top&#34; src=&#34;../../images/sending-data/token-authentication.puml.svg&#34; style=&#34;max-width: fit-content&#34; alt=&#34;images/sending-data/token-authentication.puml.svg&#34;&gt;
      

      
      &lt;div class=&#34;card-body px-0 pt-2 pb-0&#34;&gt;
        &lt;hr style=&#34;border-top: 1px solid #ddd; margin-top: 0px; margin-bottom:4px;&#34;&gt;
        &lt;figcaption class=&#34;card-text&#34; style=&#34;font-size: smaller; text-align: center;&#34;&gt;Obtaining a token and sending data with it&lt;/figcaption&gt;
      &lt;/div&gt;
      
    &lt;/figure&gt;
  &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Tokens are short lived, typically around an hour, so a sender must obtain a fresh one when the old one expires rather than caching one indefinitely.&lt;/p&gt;

&lt;div class=&#34;alert alert-primary&#34; role=&#34;alert&#34;&gt;
&lt;h4 class=&#34;alert-heading&#34;&gt;See Also&lt;/h4&gt;
&lt;div class=&#34;alert-content&#34;&gt;
  
  &lt;p&gt;See &lt;a href=&#34;../../docs/install-guide/setup/open-id/tokens-for-api/&#34;&gt;Tokens for API Use&lt;/a&gt; for creating the client credentials a sender uses, and &lt;a href=&#34;../../docs/install-guide/setup/open-id/external-idp/azure-ad/#obtaining-a-token-to-send-data&#34;&gt;Microsoft Entra ID&lt;/a&gt; for a worked example with one provider.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;


      </description>
    </item>
    
  </channel>
</rss>
