blob: 8952ceb2f5eebf6f74fc57d1aaaba1e625fe888c [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
<!--
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
This file is generated from xml source: DO NOT EDIT
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-->
<title>mod_autht_jwt - Apache HTTP Server Version 2.5</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="../style/css/prettify.css" />
<script src="../style/scripts/prettify.min.js" type="text/javascript">
</script>
<link href="../images/favicon.ico" rel="shortcut icon" /></head>
<body>
<div id="page-header">
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
<p class="apache">Apache HTTP Server Version 2.5</p>
<img alt="" src="../images/feather.png" /></div>
<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
<div id="path">
<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.5</a> &gt; <a href="./">Modules</a></div>
<div id="page-content">
<div id="preamble"><h1>Apache Module mod_autht_jwt</h1>
<div class="toplang">
<p><span>Available Languages: </span><a href="../en/mod/mod_autht_jwt.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_autht_jwt.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a></p>
</div>
<table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Token authentication using JWT tokens</td></tr>
<tr><th><a href="module-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="module-dict.html#ModuleIdentifier">Module Identifier:</a></th><td>autht_jwt_module</td></tr>
<tr><th><a href="module-dict.html#SourceFile">Source File:</a></th><td>mod_autht_jwt.c</td></tr></table>
<h3>Summary</h3>
<p>This module provides token parsing front-ends such as
<code class="module"><a href="../mod/mod_auth_bearer.html">mod_auth_bearer</a></code> the ability to authenticate users
by verifying a JWT token as described in
<a href="http://www.ietf.org/rfc/rfc7519.txt">RFC 7519</a>.</p>
<p>A JWT token is read from the <var>Authorization</var> header
with an <var>auth-scheme</var> of <var>Bearer</var>.</p>
<p>When using <code class="module"><a href="../mod/mod_auth_bearer.html">mod_auth_bearer</a></code> this module is invoked
via the
<code class="directive"><a href="../mod/mod_auth_bearer.html#authbearerprovider">AuthBearerProvider</a></code>
with the <code>jwt</code> value.</p>
<p>This module can also be used standalone to generate JWT tokens
for passing to a backend server or service. Claims are embedded within
a token, which is then optionally signed, and passed using the
<var>Authorization</var> header as a <var>Bearer</var> token.</p>
</div>
<div id="quickview"><h3 class="directives">Directives</h3>
<ul id="toc">
<li><img alt="" src="../images/down.gif" /> <a href="#authtjwtclaim">AuthtJwtClaim</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#authtjwtdriver">AuthtJwtDriver</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#authtjwtsign">AuthtJwtSign</a></li>
<li><img alt="" src="../images/down.gif" /> <a href="#authtjwtverify">AuthtJwtVerify</a></li>
</ul>
<h3>Bugfix checklist</h3><ul class="seealso"><li><a href="https://www.apache.org/dist/httpd/CHANGES_2.4">httpd changelog</a></li><li><a href="https://bz.apache.org/bugzilla/buglist.cgi?bug_status=__open__&amp;list_id=144532&amp;product=Apache%20httpd-2&amp;query_format=specific&amp;order=changeddate%20DESC%2Cpriority%2Cbug_severity&amp;component=mod_autht_jwt">Known issues</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&amp;component=mod_autht_jwt">Report a bug</a></li></ul><h3>See also</h3>
<ul class="seealso">
<li>
<code class="directive"><a href="../mod/mod_auth_bearer.html#authbearerprovider">AuthBearerProvider</a></code>
</li>
<li><a href="#comments_section">Comments</a></li></ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="AuthtJwtClaim" id="AuthtJwtClaim">AuthtJwtClaim</a> <a name="authtjwtclaim" id="authtjwtclaim">Directive</a> <a title="Permanent link" href="#authtjwtclaim" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Set a claim with the given name and expression, or unset the claim with the given name</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>AuthtJwtVerify <var>[set|unset]</var> <var>name</var> [<var>value</var>]</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>AuthConfig</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_autht_jwt</td></tr>
</table>
<p>The <code class="directive">AuthtJwtClaim</code> directive adds and/or removes
claims from token being passed to the backend server or service.</p>
<p>When a claim is set, the value of the claim is the result of an expression. The
expression may include parameters from a digital certificate, or the name of the
user that has been authenticated to Apache httpd.</p>
<div class="example"><h3>Pass Remote User Example</h3><pre class="prettyprint lang-config">&lt;Location "/secure"&gt;
AuthtJwtClaim set sub %{REMOTE_USER}
AuthtJwtSign hs256 file "/www/conf/jwt.secret"
&lt;/Location&gt;</pre>
</div>
<p>When a claim is unset, the claim previously set is removed from the token.</p>
<div class="example"><h3>Unset Claim Example</h3><pre class="prettyprint lang-config">AuthtJwtClaim set my-claim present
&lt;Location "/secure"&gt;
AuthtJwtClaim set sub %{REMOTE_USER}
AuthtJwtClaim unset my-claim
AuthtJwtSign hs256 file "/www/conf/jwt.secret"
&lt;/Location&gt;</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="AuthtJwtDriver" id="AuthtJwtDriver">AuthtJwtDriver</a> <a name="authtjwtdriver" id="authtjwtdriver">Directive</a> <a title="Permanent link" href="#authtjwtdriver" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the name of the underlying crypto driver to
use</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>AuthtJwtDriver <var>name</var> <var>[param[=value]]</var></code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_autht_jwt</td></tr>
</table>
<p>The <code class="directive">AuthtJwtDriver</code> directive specifies the name of
the crypto driver to be used for signing and verification. If not specified,
the driver defaults to the recommended driver compiled into APR-util.</p>
<p>Follow the instructions in the
<code class="directive"><a href="../mod/mod_session_crypto.html#sessioncryptodriver">SessionCryptoDriver</a></code> to
set up the driver.</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="AuthtJwtSign" id="AuthtJwtSign">AuthtJwtSign</a> <a name="authtjwtsign" id="authtjwtsign">Directive</a> <a title="Permanent link" href="#authtjwtsign" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>The JWS signing algorithm and passphrase/key to sign an outgoing
JWT token</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>AuthtJwtSign <var>algorithm</var> [<var>type</var> <var>param</var>]</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>AuthConfig</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_autht_jwt</td></tr>
</table>
<p>The <code class="directive">AuthtJwtSign</code> directive specifies the algorithm
and secret used to sign outgoing bearer tokens passed to a server or service.</p>
<p>If the algorithm type <var>none</var> is selected, the token is not
protected. Use only when the client is trusted, and the channel is protected
through other means, such as mutually authenticated TLS, or unix domain sockets.</p>
<p>Set the claims to be sent in the token using the
<code class="directive"><a href="#authtjwtclaim">AuthtJwtClaim</a></code> directive. The
<var>sub</var> claim is used to pass the remote user.</p>
<div class="example"><h3>No Verification Example</h3><pre class="prettyprint lang-config">&lt;Location "/mutual-tls-secured"&gt;
AuthtJwtClaim set sub %{REMOTE_USER}
AuthtJwtSign none
&lt;/Location&gt;</pre>
</div>
<p>If the algorithm type <var>HS256</var> is used, the algorithm is set to
<var>HMAC-SHA256</var>, and the secret is set within the <var>file</var> specified
as the third parameter. The contents of the bearer token is still visible, and so
the channel must still be protected from evesdropping through TLS.</p>
<div class="example"><h3>Verification Example</h3><pre class="prettyprint lang-config">&lt;Location "/secure"&gt;
AuthtJwtClaim set sub %{REMOTE_USER}
AuthtJwtSign hs256 file "/www/conf/jwt.secret"
&lt;/Location&gt;</pre>
</div>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
<div class="directive-section"><h2><a name="AuthtJwtVerify" id="AuthtJwtVerify">AuthtJwtVerify</a> <a name="authtjwtverify" id="authtjwtverify">Directive</a> <a title="Permanent link" href="#authtjwtverify" class="permalink">&para;</a></h2>
<table class="directive">
<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>The JWS signing algorithm and passphrase/key to verify an incoming
JWT token</td></tr>
<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>AuthtJwtVerify <var>algorithm</var> [<var>type</var> <var>param</var>]</code></td></tr>
<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>directory, .htaccess</td></tr>
<tr><th><a href="directive-dict.html#Override">Override:</a></th><td>AuthConfig</td></tr>
<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Base</td></tr>
<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_autht_jwt</td></tr>
</table>
<p>The <code class="directive">AuthtJwtVerify</code> directive specifies the algorithm
and secret used to verify incoming bearer tokens.</p>
<p>If the algorithm type <var>none</var> is selected, the token is not
protected, and will be accepted as is. Use only when the client is trusted, and the
channel is protected through other means, such as mutually authenticated TLS, or
unix domain sockets.</p>
<p>If present, the <var>sub</var> claim is assigned to REMOTE_USER.</p>
<div class="example"><h3>No Verification Example</h3><pre class="prettyprint lang-config">&lt;Location "/mutual-tls-secured"&gt;
AuthType bearer
AuthName example-name
AuthBearerProvider jwt
AuthtJwtVerify none
Require valid-user
&lt;/Location&gt;</pre>
</div>
<p>If the algorithm type <var>HS256</var> is used, the algorithm is set to
<var>HMAC-SHA256</var>, and the secret is set within the <var>file</var> specified
as the third parameter. The contents of the bearer token is still visible, and so
the channel must still be protected from evesdropping through TLS.</p>
<p>If the signature is verified, and if present, the <var>sub</var> claim is
assigned to REMOTE_USER.</p>
<div class="example"><h3>Verification Example</h3><pre class="prettyprint lang-config">&lt;Location "/secure"&gt;
AuthType bearer
AuthName example-name
AuthBearerProvider jwt
AuthtJwtVerify hs256 file "/www/conf/jwt.secret"
Require valid-user
&lt;/Location&gt;</pre>
</div>
</div>
</div>
<div class="bottomlang">
<p><span>Available Languages: </span><a href="../en/mod/mod_autht_jwt.html" title="English">&nbsp;en&nbsp;</a> |
<a href="../fr/mod/mod_autht_jwt.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a></p>
</div><div class="top"><a href="#page-header"><img src="../images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Libera.chat, or sent to our <a href="https://httpd.apache.org/lists.html">mailing lists</a>.</div>
<script type="text/javascript"><!--//--><![CDATA[//><!--
var comments_shortname = 'httpd';
var comments_identifier = 'http://httpd.apache.org/docs/trunk/mod/mod_autht_jwt.html';
(function(w, d) {
if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
d.write('<div id="comments_thread"><\/div>');
var s = d.createElement('script');
s.type = 'text/javascript';
s.async = true;
s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
(d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
}
else {
d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
}
})(window, document);
//--><!]]></script></div><div id="footer">
<p class="apache">Copyright 2023 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/quickreference.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
prettyPrint();
}
//--><!]]></script>
</body></html>