Sourcemeta Core 0.0.0
Loading...
Searching...
No Matches
jose_jwks_provider.h
1#ifndef SOURCEMETA_CORE_JOSE_JWKS_PROVIDER_H_
2#define SOURCEMETA_CORE_JOSE_JWKS_PROVIDER_H_
3
4#ifndef SOURCEMETA_CORE_JOSE_EXPORT
5#include <sourcemeta/core/jose_export.h>
6#endif
7
8#include <sourcemeta/core/jose_algorithm.h>
9#include <sourcemeta/core/jose_jwks.h>
10#include <sourcemeta/core/jose_jwt.h>
11#include <sourcemeta/core/jose_verify.h>
12
13#include <chrono> // std::chrono
14#include <functional> // std::function
15#include <memory> // std::shared_ptr
16#include <mutex> // std::mutex
17#include <optional> // std::optional, std::nullopt
18#include <span> // std::span
19#include <string> // std::string
20#include <string_view> // std::string_view
21
22namespace sourcemeta::core {
23
32class SOURCEMETA_CORE_JOSE_EXPORT JWKSProvider {
33public:
38 struct FetchResult {
40 std::string body;
42 std::optional<std::chrono::seconds> max_age;
43 };
44
50 using Fetcher =
51 std::function<std::optional<FetchResult>(std::string_view url)>;
52
56 using Clock = std::function<std::chrono::system_clock::time_point()>;
57
59 struct Options {
61 std::chrono::seconds fallback_ttl{std::chrono::hours{1}};
63 std::chrono::seconds minimum_ttl{std::chrono::minutes{5}};
65 std::chrono::seconds maximum_ttl{std::chrono::hours{24}};
68 std::chrono::seconds unknown_kid_cooldown{std::chrono::minutes{5}};
74 };
75
78 JWKSProvider(std::string jwks_uri, Fetcher fetcher);
81 JWKSProvider(std::string jwks_uri, Fetcher fetcher, Options options);
84 JWKSProvider(std::string jwks_uri, Fetcher fetcher, Options options,
85 Clock clock);
86
89 JWKSProvider(const JWKSProvider &) = delete;
90 auto operator=(const JWKSProvider &) -> JWKSProvider & = delete;
91 JWKSProvider(JWKSProvider &&) = delete;
92 auto operator=(JWKSProvider &&) -> JWKSProvider & = delete;
93
109 [[nodiscard]] auto
110 verify(const JWT &token,
111 const std::span<const JWSAlgorithm> allowed_algorithms,
112 const std::string_view expected_issuer,
113 const std::string_view expected_audience,
114 const std::optional<std::string_view> expected_subject,
115 const std::optional<std::string_view> expected_type)
116 -> std::optional<JWTVerificationError>;
117
120 [[nodiscard]] auto verify_access_token(
121 const JWT &token, const std::span<const JWSAlgorithm> allowed_algorithms,
122 const std::string_view expected_issuer,
123 const std::string_view expected_audience,
124 const std::optional<std::string_view> expected_subject = std::nullopt)
125 -> std::optional<JWTVerificationError>;
126
132 [[nodiscard]] auto
133 verify(const JWT &token,
134 const std::span<const JWSAlgorithm> allowed_algorithms,
135 const std::string_view expected_issuer,
136 const std::string_view expected_audience,
137 const std::optional<std::string_view> expected_subject,
138 const std::optional<std::string_view> expected_type,
139 std::chrono::system_clock::time_point &resolved_now)
140 -> std::optional<JWTVerificationError>;
141
142private:
143 auto verify_at(const JWT &token,
144 const std::span<const JWSAlgorithm> allowed_algorithms,
145 const std::string_view expected_issuer,
146 const std::string_view expected_audience,
147 const std::optional<std::string_view> expected_subject,
148 const std::optional<std::string_view> expected_type,
149 const std::chrono::system_clock::time_point now)
150 -> std::optional<JWTVerificationError>;
151 auto fetch_and_install_locked(std::chrono::system_clock::time_point now)
152 -> bool;
153 auto refresh_locked(std::chrono::system_clock::time_point now)
154 -> std::shared_ptr<const JWKS>;
155 auto refetch_for_unknown_kid_locked(std::chrono::system_clock::time_point now)
156 -> std::shared_ptr<const JWKS>;
157
158#if defined(_MSC_VER)
159#pragma warning(disable : 4251)
160#endif
161 const std::string jwks_uri_;
162 const Fetcher fetcher_;
163 const Options options_;
164 const Clock clock_;
165 std::mutex mutex_;
166 std::shared_ptr<const JWKS> keys_;
167 std::chrono::system_clock::time_point next_refresh_{};
168 std::chrono::system_clock::time_point unknown_kid_cooldown_until_{};
169#if defined(_MSC_VER)
170#pragma warning(default : 4251)
171#endif
172};
173
174} // namespace sourcemeta::core
175
176#endif
auto verify(const JWT &token, const std::span< const JWSAlgorithm > allowed_algorithms, const std::string_view expected_issuer, const std::string_view expected_audience, const std::optional< std::string_view > expected_subject, const std::optional< std::string_view > expected_type) -> std::optional< JWTVerificationError >
std::function< std::chrono::system_clock::time_point()> Clock
Definition jose_jwks_provider.h:56
std::function< std::optional< FetchResult >(std::string_view url)> Fetcher
Definition jose_jwks_provider.h:50
JWKSProvider(const JWKSProvider &)=delete
auto verify_access_token(const JWT &token, const std::span< const JWSAlgorithm > allowed_algorithms, const std::string_view expected_issuer, const std::string_view expected_audience, const std::optional< std::string_view > expected_subject=std::nullopt) -> std::optional< JWTVerificationError >
JWKSProvider(std::string jwks_uri, Fetcher fetcher, Options options, Clock clock)
auto verify(const JWT &token, const std::span< const JWSAlgorithm > allowed_algorithms, const std::string_view expected_issuer, const std::string_view expected_audience, const std::optional< std::string_view > expected_subject, const std::optional< std::string_view > expected_type, std::chrono::system_clock::time_point &resolved_now) -> std::optional< JWTVerificationError >
JWKSProvider(std::string jwks_uri, Fetcher fetcher)
JWKSProvider(std::string jwks_uri, Fetcher fetcher, Options options)
Definition jose_jwt.h:38
Definition jose_verify.h:57
Definition jose_jwks_provider.h:38
std::optional< std::chrono::seconds > max_age
The advertised freshness lifetime, absent when none was given.
Definition jose_jwks_provider.h:42
std::string body
The raw key set bytes.
Definition jose_jwks_provider.h:40
Tunables for the caching and verification policy.
Definition jose_jwks_provider.h:59
std::chrono::seconds maximum_ttl
The longest lifetime honored, clamping larger advertised values down.
Definition jose_jwks_provider.h:65
std::chrono::seconds minimum_ttl
The shortest lifetime honored, clamping smaller advertised values up.
Definition jose_jwks_provider.h:63
std::chrono::seconds unknown_kid_cooldown
Definition jose_jwks_provider.h:68
std::chrono::seconds fallback_ttl
The lifetime to assume when the transport advertises none.
Definition jose_jwks_provider.h:61
JWTClockSkew clock_skew
Definition jose_jwks_provider.h:73