Skip to content

Add option to verify JWT tokens in the HTTP Authorization header - #72

Merged
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth
Dec 17, 2025
Merged

Add option to verify JWT tokens in the HTTP Authorization header#72
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth

Conversation

@tankyleo

Copy link
Copy Markdown
Contributor

No description provided.

@ldk-reviews-bot

ldk-reviews-bot commented Dec 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @tnull as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct Config {
pub(crate) server_config: ServerConfig,
pub(crate) postgresql_config: Option<PostgreSQLConfig>,
pub(crate) postgresql_config: PostgreSQLConfig,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this mandatory now? How will this work with the InMemoryStore or any other impl we'll add?

@tankyleotankyleoDec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We currently don't support any alternative backends, and expect if this is None. I would prefer failing earlier, with the Config member type to represent our current status (ie not Option<PostgreSQLConfig> but PostgreSQLConfig).

The error message if the postgresql_config table is not present is this one:

Failed to load configuration: TOML parse error at line 1, column 1
|
1 | [server_config]
| ^
missing field `postgresql_config`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Yeah, I think it would be preferable if we already know that we'll have different backends.

@tankyleo

tankyleo commented Dec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

@tankyleo
tankyleo requested a review from tnullDecember 8, 2025 16:51
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnull

Copy link
Copy Markdown
Contributor

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

Discussed this elsewhere: it would be good to add issuance to the vss-server in order to provide users with a ready-to-go solution. Though, that doesn't need to happen as part of this PR ofc.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, some minor comments.

Do we see a chance of adding a test for the authorizer? Maybe with some fixtures?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct ServerConfig {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) rsa_pub_file_path: Option<String>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't that rather be part of a new optional JwtAuthConfig section?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make it also possible to use an env var, since it's easier to use that on a k8s environment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See below @frnandu we now ask for the full PEM string, not the file that contains the string, either as an env var, or in the config.

Comment threadrust/auth-impls/src/lib.rs Outdated
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

pub use jsonwebtoken::DecodingKey;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Hmm, leaking this auth-depdenent type to main.rs is a bit strange. Wouldn't it rather make sense to have JWTAuthorizer::new be fallible and handle the teh DecodingKey::from_rsa_pem step?

Comment threadrust/server/src/main.rs Outdated
mod util;
mod vss_service;

use util::config::{Config, ServerConfig};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This likely should import be added in the above group.

std::process::exit(1);
},
};
let addr: SocketAddr = match format!("{}:{}", host, port).parse() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot going on here. Can we declutter this? Btw, since we're already here, might make sense to switch this to the From<(I, u16)> for SocketAddr implementation rather than allocating a string and then parsing it again.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is personal preference, but in the follow-up PR I consolidate the host and port setting into a single address setting, string type, ie "127.0.0.1:54234". We would then allocate the string upfront. WDYT ? Overall looking to reduce the number of lines in the config files, and the number of different settings. The address the server binds to is a single setting in my head :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah probably makes sense to make it one.

@tankyleotankyleo self-assigned this Dec 11, 2025
@tankyleotankyleo moved this to Goal: Merge in Weekly GoalsDec 11, 2025
@tankyleo
tankyleoforce-pushed the rust-jwt-auth branch 3 times, most recently from 7d4b8bd to 5c555c0CompareDecember 15, 2025 23:54
@tankyleo
tankyleo requested a review from tnullDecember 16, 2025 00:02

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, please squash.

The RSA public key against which the JWT tokens are verified can be set
either via a configuration file setting, or an environment variable,
with the latter having the higher priority.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Squashed with no further changes.

@tnull
tnull merged commit 6a2278a into lightningdevkit:mainDec 17, 2025
2 checks passed
@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsDec 17, 2025
@tankyleo
tankyleo deleted the rust-jwt-auth branch December 17, 2025 17:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tankyleo@ldk-reviews-bot@tnull@frnandu
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add option to verify JWT tokens in the HTTP Authorization header by tankyleo · Pull Request #72 · lightningdevkit/vss-server · GitHub
Skip to content

Add option to verify JWT tokens in the HTTP Authorization header - #72

Merged
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth
Dec 17, 2025
Merged

Add option to verify JWT tokens in the HTTP Authorization header#72
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth

Conversation

@tankyleo

Copy link
Copy Markdown
Contributor

No description provided.

@ldk-reviews-bot

ldk-reviews-bot commented Dec 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @tnull as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct Config {
pub(crate) server_config: ServerConfig,
pub(crate) postgresql_config: Option<PostgreSQLConfig>,
pub(crate) postgresql_config: PostgreSQLConfig,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this mandatory now? How will this work with the InMemoryStore or any other impl we'll add?

@tankyleotankyleoDec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We currently don't support any alternative backends, and expect if this is None. I would prefer failing earlier, with the Config member type to represent our current status (ie not Option<PostgreSQLConfig> but PostgreSQLConfig).

The error message if the postgresql_config table is not present is this one:

Failed to load configuration: TOML parse error at line 1, column 1
|
1 | [server_config]
| ^
missing field `postgresql_config`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Yeah, I think it would be preferable if we already know that we'll have different backends.

@tankyleo

tankyleo commented Dec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

@tankyleo
tankyleo requested a review from tnullDecember 8, 2025 16:51
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnull

Copy link
Copy Markdown
Contributor

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

Discussed this elsewhere: it would be good to add issuance to the vss-server in order to provide users with a ready-to-go solution. Though, that doesn't need to happen as part of this PR ofc.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, some minor comments.

Do we see a chance of adding a test for the authorizer? Maybe with some fixtures?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct ServerConfig {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) rsa_pub_file_path: Option<String>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't that rather be part of a new optional JwtAuthConfig section?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make it also possible to use an env var, since it's easier to use that on a k8s environment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See below @frnandu we now ask for the full PEM string, not the file that contains the string, either as an env var, or in the config.

Comment threadrust/auth-impls/src/lib.rs Outdated
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

pub use jsonwebtoken::DecodingKey;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Hmm, leaking this auth-depdenent type to main.rs is a bit strange. Wouldn't it rather make sense to have JWTAuthorizer::new be fallible and handle the teh DecodingKey::from_rsa_pem step?

Comment threadrust/server/src/main.rs Outdated
mod util;
mod vss_service;

use util::config::{Config, ServerConfig};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This likely should import be added in the above group.

std::process::exit(1);
},
};
let addr: SocketAddr = match format!("{}:{}", host, port).parse() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot going on here. Can we declutter this? Btw, since we're already here, might make sense to switch this to the From<(I, u16)> for SocketAddr implementation rather than allocating a string and then parsing it again.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is personal preference, but in the follow-up PR I consolidate the host and port setting into a single address setting, string type, ie "127.0.0.1:54234". We would then allocate the string upfront. WDYT ? Overall looking to reduce the number of lines in the config files, and the number of different settings. The address the server binds to is a single setting in my head :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah probably makes sense to make it one.

@tankyleotankyleo self-assigned this Dec 11, 2025
@tankyleotankyleo moved this to Goal: Merge in Weekly GoalsDec 11, 2025
@tankyleo
tankyleoforce-pushed the rust-jwt-auth branch 3 times, most recently from 7d4b8bd to 5c555c0CompareDecember 15, 2025 23:54
@tankyleo
tankyleo requested a review from tnullDecember 16, 2025 00:02

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, please squash.

The RSA public key against which the JWT tokens are verified can be set
either via a configuration file setting, or an environment variable,
with the latter having the higher priority.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Squashed with no further changes.

@tnull
tnull merged commit 6a2278a into lightningdevkit:mainDec 17, 2025
2 checks passed
@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsDec 17, 2025
@tankyleo
tankyleo deleted the rust-jwt-auth branch December 17, 2025 17:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tankyleo@ldk-reviews-bot@tnull@frnandu
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add option to verify JWT tokens in the HTTP Authorization header by tankyleo · Pull Request #72 · lightningdevkit/vss-server · GitHub
Skip to content

Add option to verify JWT tokens in the HTTP Authorization header - #72

Merged
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth
Dec 17, 2025
Merged

Add option to verify JWT tokens in the HTTP Authorization header#72
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth

Conversation

@tankyleo

Copy link
Copy Markdown
Contributor

No description provided.

@ldk-reviews-bot

ldk-reviews-bot commented Dec 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @tnull as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct Config {
pub(crate) server_config: ServerConfig,
pub(crate) postgresql_config: Option<PostgreSQLConfig>,
pub(crate) postgresql_config: PostgreSQLConfig,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this mandatory now? How will this work with the InMemoryStore or any other impl we'll add?

@tankyleotankyleoDec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We currently don't support any alternative backends, and expect if this is None. I would prefer failing earlier, with the Config member type to represent our current status (ie not Option<PostgreSQLConfig> but PostgreSQLConfig).

The error message if the postgresql_config table is not present is this one:

Failed to load configuration: TOML parse error at line 1, column 1
|
1 | [server_config]
| ^
missing field `postgresql_config`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Yeah, I think it would be preferable if we already know that we'll have different backends.

@tankyleo

tankyleo commented Dec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

@tankyleo
tankyleo requested a review from tnullDecember 8, 2025 16:51
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnull

Copy link
Copy Markdown
Contributor

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

Discussed this elsewhere: it would be good to add issuance to the vss-server in order to provide users with a ready-to-go solution. Though, that doesn't need to happen as part of this PR ofc.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, some minor comments.

Do we see a chance of adding a test for the authorizer? Maybe with some fixtures?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct ServerConfig {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) rsa_pub_file_path: Option<String>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't that rather be part of a new optional JwtAuthConfig section?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make it also possible to use an env var, since it's easier to use that on a k8s environment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See below @frnandu we now ask for the full PEM string, not the file that contains the string, either as an env var, or in the config.

Comment threadrust/auth-impls/src/lib.rs Outdated
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

pub use jsonwebtoken::DecodingKey;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Hmm, leaking this auth-depdenent type to main.rs is a bit strange. Wouldn't it rather make sense to have JWTAuthorizer::new be fallible and handle the teh DecodingKey::from_rsa_pem step?

Comment threadrust/server/src/main.rs Outdated
mod util;
mod vss_service;

use util::config::{Config, ServerConfig};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This likely should import be added in the above group.

std::process::exit(1);
},
};
let addr: SocketAddr = match format!("{}:{}", host, port).parse() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot going on here. Can we declutter this? Btw, since we're already here, might make sense to switch this to the From<(I, u16)> for SocketAddr implementation rather than allocating a string and then parsing it again.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is personal preference, but in the follow-up PR I consolidate the host and port setting into a single address setting, string type, ie "127.0.0.1:54234". We would then allocate the string upfront. WDYT ? Overall looking to reduce the number of lines in the config files, and the number of different settings. The address the server binds to is a single setting in my head :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah probably makes sense to make it one.

@tankyleotankyleo self-assigned this Dec 11, 2025
@tankyleotankyleo moved this to Goal: Merge in Weekly GoalsDec 11, 2025
@tankyleo
tankyleoforce-pushed the rust-jwt-auth branch 3 times, most recently from 7d4b8bd to 5c555c0CompareDecember 15, 2025 23:54
@tankyleo
tankyleo requested a review from tnullDecember 16, 2025 00:02

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, please squash.

The RSA public key against which the JWT tokens are verified can be set
either via a configuration file setting, or an environment variable,
with the latter having the higher priority.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Squashed with no further changes.

@tnull
tnull merged commit 6a2278a into lightningdevkit:mainDec 17, 2025
2 checks passed
@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsDec 17, 2025
@tankyleo
tankyleo deleted the rust-jwt-auth branch December 17, 2025 17:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tankyleo@ldk-reviews-bot@tnull@frnandu
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add option to verify JWT tokens in the HTTP Authorization header by tankyleo · Pull Request #72 · lightningdevkit/vss-server · GitHub
Skip to content

Add option to verify JWT tokens in the HTTP Authorization header - #72

Merged
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth
Dec 17, 2025
Merged

Add option to verify JWT tokens in the HTTP Authorization header#72
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth

Conversation

@tankyleo

Copy link
Copy Markdown
Contributor

No description provided.

@ldk-reviews-bot

ldk-reviews-bot commented Dec 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @tnull as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct Config {
pub(crate) server_config: ServerConfig,
pub(crate) postgresql_config: Option<PostgreSQLConfig>,
pub(crate) postgresql_config: PostgreSQLConfig,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this mandatory now? How will this work with the InMemoryStore or any other impl we'll add?

@tankyleotankyleoDec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We currently don't support any alternative backends, and expect if this is None. I would prefer failing earlier, with the Config member type to represent our current status (ie not Option<PostgreSQLConfig> but PostgreSQLConfig).

The error message if the postgresql_config table is not present is this one:

Failed to load configuration: TOML parse error at line 1, column 1
|
1 | [server_config]
| ^
missing field `postgresql_config`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Yeah, I think it would be preferable if we already know that we'll have different backends.

@tankyleo

tankyleo commented Dec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

@tankyleo
tankyleo requested a review from tnullDecember 8, 2025 16:51
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnull

Copy link
Copy Markdown
Contributor

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

Discussed this elsewhere: it would be good to add issuance to the vss-server in order to provide users with a ready-to-go solution. Though, that doesn't need to happen as part of this PR ofc.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, some minor comments.

Do we see a chance of adding a test for the authorizer? Maybe with some fixtures?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct ServerConfig {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) rsa_pub_file_path: Option<String>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't that rather be part of a new optional JwtAuthConfig section?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make it also possible to use an env var, since it's easier to use that on a k8s environment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See below @frnandu we now ask for the full PEM string, not the file that contains the string, either as an env var, or in the config.

Comment threadrust/auth-impls/src/lib.rs Outdated
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

pub use jsonwebtoken::DecodingKey;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Hmm, leaking this auth-depdenent type to main.rs is a bit strange. Wouldn't it rather make sense to have JWTAuthorizer::new be fallible and handle the teh DecodingKey::from_rsa_pem step?

Comment threadrust/server/src/main.rs Outdated
mod util;
mod vss_service;

use util::config::{Config, ServerConfig};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This likely should import be added in the above group.

std::process::exit(1);
},
};
let addr: SocketAddr = match format!("{}:{}", host, port).parse() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot going on here. Can we declutter this? Btw, since we're already here, might make sense to switch this to the From<(I, u16)> for SocketAddr implementation rather than allocating a string and then parsing it again.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is personal preference, but in the follow-up PR I consolidate the host and port setting into a single address setting, string type, ie "127.0.0.1:54234". We would then allocate the string upfront. WDYT ? Overall looking to reduce the number of lines in the config files, and the number of different settings. The address the server binds to is a single setting in my head :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah probably makes sense to make it one.

@tankyleotankyleo self-assigned this Dec 11, 2025
@tankyleotankyleo moved this to Goal: Merge in Weekly GoalsDec 11, 2025
@tankyleo
tankyleoforce-pushed the rust-jwt-auth branch 3 times, most recently from 7d4b8bd to 5c555c0CompareDecember 15, 2025 23:54
@tankyleo
tankyleo requested a review from tnullDecember 16, 2025 00:02

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, please squash.

The RSA public key against which the JWT tokens are verified can be set
either via a configuration file setting, or an environment variable,
with the latter having the higher priority.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Squashed with no further changes.

@tnull
tnull merged commit 6a2278a into lightningdevkit:mainDec 17, 2025
2 checks passed
@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsDec 17, 2025
@tankyleo
tankyleo deleted the rust-jwt-auth branch December 17, 2025 17:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tankyleo@ldk-reviews-bot@tnull@frnandu
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Add option to verify JWT tokens in the HTTP Authorization header by tankyleo · Pull Request #72 · lightningdevkit/vss-server · GitHub
Skip to content

Add option to verify JWT tokens in the HTTP Authorization header - #72

Merged
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth
Dec 17, 2025
Merged

Add option to verify JWT tokens in the HTTP Authorization header#72
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth

Conversation

@tankyleo

Copy link
Copy Markdown
Contributor

No description provided.

@ldk-reviews-bot

ldk-reviews-bot commented Dec 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @tnull as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct Config {
pub(crate) server_config: ServerConfig,
pub(crate) postgresql_config: Option<PostgreSQLConfig>,
pub(crate) postgresql_config: PostgreSQLConfig,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this mandatory now? How will this work with the InMemoryStore or any other impl we'll add?

@tankyleotankyleoDec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We currently don't support any alternative backends, and expect if this is None. I would prefer failing earlier, with the Config member type to represent our current status (ie not Option<PostgreSQLConfig> but PostgreSQLConfig).

The error message if the postgresql_config table is not present is this one:

Failed to load configuration: TOML parse error at line 1, column 1
|
1 | [server_config]
| ^
missing field `postgresql_config`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Yeah, I think it would be preferable if we already know that we'll have different backends.

@tankyleo

tankyleo commented Dec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

@tankyleo
tankyleo requested a review from tnullDecember 8, 2025 16:51
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnull

Copy link
Copy Markdown
Contributor

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

Discussed this elsewhere: it would be good to add issuance to the vss-server in order to provide users with a ready-to-go solution. Though, that doesn't need to happen as part of this PR ofc.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, some minor comments.

Do we see a chance of adding a test for the authorizer? Maybe with some fixtures?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct ServerConfig {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) rsa_pub_file_path: Option<String>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't that rather be part of a new optional JwtAuthConfig section?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make it also possible to use an env var, since it's easier to use that on a k8s environment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See below @frnandu we now ask for the full PEM string, not the file that contains the string, either as an env var, or in the config.

Comment threadrust/auth-impls/src/lib.rs Outdated
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

pub use jsonwebtoken::DecodingKey;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Hmm, leaking this auth-depdenent type to main.rs is a bit strange. Wouldn't it rather make sense to have JWTAuthorizer::new be fallible and handle the teh DecodingKey::from_rsa_pem step?

Comment threadrust/server/src/main.rs Outdated
mod util;
mod vss_service;

use util::config::{Config, ServerConfig};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This likely should import be added in the above group.

std::process::exit(1);
},
};
let addr: SocketAddr = match format!("{}:{}", host, port).parse() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot going on here. Can we declutter this? Btw, since we're already here, might make sense to switch this to the From<(I, u16)> for SocketAddr implementation rather than allocating a string and then parsing it again.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is personal preference, but in the follow-up PR I consolidate the host and port setting into a single address setting, string type, ie "127.0.0.1:54234". We would then allocate the string upfront. WDYT ? Overall looking to reduce the number of lines in the config files, and the number of different settings. The address the server binds to is a single setting in my head :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah probably makes sense to make it one.

@tankyleotankyleo self-assigned this Dec 11, 2025
@tankyleotankyleo moved this to Goal: Merge in Weekly GoalsDec 11, 2025
@tankyleo
tankyleoforce-pushed the rust-jwt-auth branch 3 times, most recently from 7d4b8bd to 5c555c0CompareDecember 15, 2025 23:54
@tankyleo
tankyleo requested a review from tnullDecember 16, 2025 00:02

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, please squash.

The RSA public key against which the JWT tokens are verified can be set
either via a configuration file setting, or an environment variable,
with the latter having the higher priority.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Squashed with no further changes.

@tnull
tnull merged commit 6a2278a into lightningdevkit:mainDec 17, 2025
2 checks passed
@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsDec 17, 2025
@tankyleo
tankyleo deleted the rust-jwt-auth branch December 17, 2025 17:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tankyleo@ldk-reviews-bot@tnull@frnandu
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add option to verify JWT tokens in the HTTP Authorization header by tankyleo · Pull Request #72 · lightningdevkit/vss-server · GitHub
Skip to content

Add option to verify JWT tokens in the HTTP Authorization header - #72

Merged
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth
Dec 17, 2025
Merged

Add option to verify JWT tokens in the HTTP Authorization header#72
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth

Conversation

@tankyleo

Copy link
Copy Markdown
Contributor

No description provided.

@ldk-reviews-bot

ldk-reviews-bot commented Dec 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @tnull as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct Config {
pub(crate) server_config: ServerConfig,
pub(crate) postgresql_config: Option<PostgreSQLConfig>,
pub(crate) postgresql_config: PostgreSQLConfig,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this mandatory now? How will this work with the InMemoryStore or any other impl we'll add?

@tankyleotankyleoDec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We currently don't support any alternative backends, and expect if this is None. I would prefer failing earlier, with the Config member type to represent our current status (ie not Option<PostgreSQLConfig> but PostgreSQLConfig).

The error message if the postgresql_config table is not present is this one:

Failed to load configuration: TOML parse error at line 1, column 1
|
1 | [server_config]
| ^
missing field `postgresql_config`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Yeah, I think it would be preferable if we already know that we'll have different backends.

@tankyleo

tankyleo commented Dec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

@tankyleo
tankyleo requested a review from tnullDecember 8, 2025 16:51
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnull

Copy link
Copy Markdown
Contributor

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

Discussed this elsewhere: it would be good to add issuance to the vss-server in order to provide users with a ready-to-go solution. Though, that doesn't need to happen as part of this PR ofc.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, some minor comments.

Do we see a chance of adding a test for the authorizer? Maybe with some fixtures?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct ServerConfig {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) rsa_pub_file_path: Option<String>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't that rather be part of a new optional JwtAuthConfig section?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make it also possible to use an env var, since it's easier to use that on a k8s environment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See below @frnandu we now ask for the full PEM string, not the file that contains the string, either as an env var, or in the config.

Comment threadrust/auth-impls/src/lib.rs Outdated
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

pub use jsonwebtoken::DecodingKey;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Hmm, leaking this auth-depdenent type to main.rs is a bit strange. Wouldn't it rather make sense to have JWTAuthorizer::new be fallible and handle the teh DecodingKey::from_rsa_pem step?

Comment threadrust/server/src/main.rs Outdated
mod util;
mod vss_service;

use util::config::{Config, ServerConfig};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This likely should import be added in the above group.

std::process::exit(1);
},
};
let addr: SocketAddr = match format!("{}:{}", host, port).parse() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot going on here. Can we declutter this? Btw, since we're already here, might make sense to switch this to the From<(I, u16)> for SocketAddr implementation rather than allocating a string and then parsing it again.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is personal preference, but in the follow-up PR I consolidate the host and port setting into a single address setting, string type, ie "127.0.0.1:54234". We would then allocate the string upfront. WDYT ? Overall looking to reduce the number of lines in the config files, and the number of different settings. The address the server binds to is a single setting in my head :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah probably makes sense to make it one.

@tankyleotankyleo self-assigned this Dec 11, 2025
@tankyleotankyleo moved this to Goal: Merge in Weekly GoalsDec 11, 2025
@tankyleo
tankyleoforce-pushed the rust-jwt-auth branch 3 times, most recently from 7d4b8bd to 5c555c0CompareDecember 15, 2025 23:54
@tankyleo
tankyleo requested a review from tnullDecember 16, 2025 00:02

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, please squash.

The RSA public key against which the JWT tokens are verified can be set
either via a configuration file setting, or an environment variable,
with the latter having the higher priority.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Squashed with no further changes.

@tnull
tnull merged commit 6a2278a into lightningdevkit:mainDec 17, 2025
2 checks passed
@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsDec 17, 2025
@tankyleo
tankyleo deleted the rust-jwt-auth branch December 17, 2025 17:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tankyleo@ldk-reviews-bot@tnull@frnandu
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add option to verify JWT tokens in the HTTP Authorization header by tankyleo · Pull Request #72 · lightningdevkit/vss-server · GitHub
Skip to content

Add option to verify JWT tokens in the HTTP Authorization header - #72

Merged
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth
Dec 17, 2025
Merged

Add option to verify JWT tokens in the HTTP Authorization header#72
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth

Conversation

@tankyleo

Copy link
Copy Markdown
Contributor

No description provided.

@ldk-reviews-bot

ldk-reviews-bot commented Dec 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @tnull as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct Config {
pub(crate) server_config: ServerConfig,
pub(crate) postgresql_config: Option<PostgreSQLConfig>,
pub(crate) postgresql_config: PostgreSQLConfig,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this mandatory now? How will this work with the InMemoryStore or any other impl we'll add?

@tankyleotankyleoDec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We currently don't support any alternative backends, and expect if this is None. I would prefer failing earlier, with the Config member type to represent our current status (ie not Option<PostgreSQLConfig> but PostgreSQLConfig).

The error message if the postgresql_config table is not present is this one:

Failed to load configuration: TOML parse error at line 1, column 1
|
1 | [server_config]
| ^
missing field `postgresql_config`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Yeah, I think it would be preferable if we already know that we'll have different backends.

@tankyleo

tankyleo commented Dec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

@tankyleo
tankyleo requested a review from tnullDecember 8, 2025 16:51
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnull

Copy link
Copy Markdown
Contributor

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

Discussed this elsewhere: it would be good to add issuance to the vss-server in order to provide users with a ready-to-go solution. Though, that doesn't need to happen as part of this PR ofc.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, some minor comments.

Do we see a chance of adding a test for the authorizer? Maybe with some fixtures?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct ServerConfig {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) rsa_pub_file_path: Option<String>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't that rather be part of a new optional JwtAuthConfig section?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make it also possible to use an env var, since it's easier to use that on a k8s environment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See below @frnandu we now ask for the full PEM string, not the file that contains the string, either as an env var, or in the config.

Comment threadrust/auth-impls/src/lib.rs Outdated
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

pub use jsonwebtoken::DecodingKey;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Hmm, leaking this auth-depdenent type to main.rs is a bit strange. Wouldn't it rather make sense to have JWTAuthorizer::new be fallible and handle the teh DecodingKey::from_rsa_pem step?

Comment threadrust/server/src/main.rs Outdated
mod util;
mod vss_service;

use util::config::{Config, ServerConfig};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This likely should import be added in the above group.

std::process::exit(1);
},
};
let addr: SocketAddr = match format!("{}:{}", host, port).parse() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot going on here. Can we declutter this? Btw, since we're already here, might make sense to switch this to the From<(I, u16)> for SocketAddr implementation rather than allocating a string and then parsing it again.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is personal preference, but in the follow-up PR I consolidate the host and port setting into a single address setting, string type, ie "127.0.0.1:54234". We would then allocate the string upfront. WDYT ? Overall looking to reduce the number of lines in the config files, and the number of different settings. The address the server binds to is a single setting in my head :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah probably makes sense to make it one.

@tankyleotankyleo self-assigned this Dec 11, 2025
@tankyleotankyleo moved this to Goal: Merge in Weekly GoalsDec 11, 2025
@tankyleo
tankyleoforce-pushed the rust-jwt-auth branch 3 times, most recently from 7d4b8bd to 5c555c0CompareDecember 15, 2025 23:54
@tankyleo
tankyleo requested a review from tnullDecember 16, 2025 00:02

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, please squash.

The RSA public key against which the JWT tokens are verified can be set
either via a configuration file setting, or an environment variable,
with the latter having the higher priority.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Squashed with no further changes.

@tnull
tnull merged commit 6a2278a into lightningdevkit:mainDec 17, 2025
2 checks passed
@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsDec 17, 2025
@tankyleo
tankyleo deleted the rust-jwt-auth branch December 17, 2025 17:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tankyleo@ldk-reviews-bot@tnull@frnandu
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Add option to verify JWT tokens in the HTTP Authorization header by tankyleo · Pull Request #72 · lightningdevkit/vss-server · GitHub
Skip to content

Add option to verify JWT tokens in the HTTP Authorization header - #72

Merged
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth
Dec 17, 2025
Merged

Add option to verify JWT tokens in the HTTP Authorization header#72
tnull merged 1 commit into
lightningdevkit:mainfrom
tankyleo:rust-jwt-auth

Conversation

@tankyleo

Copy link
Copy Markdown
Contributor

No description provided.

@ldk-reviews-bot

ldk-reviews-bot commented Dec 6, 2025

Copy link
Copy Markdown

👋 Thanks for assigning @tnull as a reviewer!
I'll wait for their review and will help manage the review process.
Once they submit their review, I'll check if a second reviewer would be helpful.

@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct Config {
pub(crate) server_config: ServerConfig,
pub(crate) postgresql_config: Option<PostgreSQLConfig>,
pub(crate) postgresql_config: PostgreSQLConfig,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this mandatory now? How will this work with the InMemoryStore or any other impl we'll add?

@tankyleotankyleoDec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We currently don't support any alternative backends, and expect if this is None. I would prefer failing earlier, with the Config member type to represent our current status (ie not Option<PostgreSQLConfig> but PostgreSQLConfig).

The error message if the postgresql_config table is not present is this one:

Failed to load configuration: TOML parse error at line 1, column 1
|
1 | [server_config]
| ^
missing field `postgresql_config`

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I'm thinking we keep this Option to open up the InMemoryStore use case later.

Yeah, I think it would be preferable if we already know that we'll have different backends.

@tankyleo

tankyleo commented Dec 8, 2025

Copy link
Copy Markdown
ContributorAuthor

Seems relatively straightforward - but for my understanding: is the plan to also add the issuance part in this PR?

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

@tankyleo
tankyleo requested a review from tnullDecember 8, 2025 16:51
@ldk-reviews-bot

Copy link
Copy Markdown

🔔 1st Reminder

Hey @tnull! This PR has been waiting for your review.
Please take a look when you have a chance. If you're unable to review, please let us know so we can find another reviewer.

@tnull

Copy link
Copy Markdown
Contributor

Do you think issuance is in-scope for VSS-server ? My immediate thinking is VSS-server should only be verifying, and not touch the private key. Issuance should be handled by something separate with different security measures that does have this privileged access to the private key.

See vss channel, it seems the immediate request from users is just the ability to set the public key for verifying JWT tokens.

Discussed this elsewhere: it would be good to add issuance to the vss-server in order to provide users with a ready-to-go solution. Though, that doesn't need to happen as part of this PR ofc.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally looks good, some minor comments.

Do we see a chance of adding a test for the authorizer? Maybe with some fixtures?

Comment threadrust/server/src/util/config.rs Outdated
pub(crate) struct ServerConfig {
pub(crate) host: String,
pub(crate) port: u16,
pub(crate) rsa_pub_file_path: Option<String>,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't that rather be part of a new optional JwtAuthConfig section?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please make it also possible to use an env var, since it's easier to use that on a k8s environment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See below @frnandu we now ask for the full PEM string, not the file that contains the string, either as an env var, or in the config.

Comment threadrust/auth-impls/src/lib.rs Outdated
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

pub use jsonwebtoken::DecodingKey;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Hmm, leaking this auth-depdenent type to main.rs is a bit strange. Wouldn't it rather make sense to have JWTAuthorizer::new be fallible and handle the teh DecodingKey::from_rsa_pem step?

Comment threadrust/server/src/main.rs Outdated
mod util;
mod vss_service;

use util::config::{Config, ServerConfig};

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: This likely should import be added in the above group.

std::process::exit(1);
},
};
let addr: SocketAddr = match format!("{}:{}", host, port).parse() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a lot going on here. Can we declutter this? Btw, since we're already here, might make sense to switch this to the From<(I, u16)> for SocketAddr implementation rather than allocating a string and then parsing it again.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is personal preference, but in the follow-up PR I consolidate the host and port setting into a single address setting, string type, ie "127.0.0.1:54234". We would then allocate the string upfront. WDYT ? Overall looking to reduce the number of lines in the config files, and the number of different settings. The address the server binds to is a single setting in my head :)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah probably makes sense to make it one.

@tankyleotankyleo self-assigned this Dec 11, 2025
@tankyleotankyleo moved this to Goal: Merge in Weekly GoalsDec 11, 2025
@tankyleo
tankyleoforce-pushed the rust-jwt-auth branch 3 times, most recently from 7d4b8bd to 5c555c0CompareDecember 15, 2025 23:54
@tankyleo
tankyleo requested a review from tnullDecember 16, 2025 00:02

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, please squash.

The RSA public key against which the JWT tokens are verified can be set
either via a configuration file setting, or an environment variable,
with the latter having the higher priority.
@tankyleo

Copy link
Copy Markdown
ContributorAuthor

Squashed with no further changes.

@tnull
tnull merged commit 6a2278a into lightningdevkit:mainDec 17, 2025
2 checks passed
@github-project-automationgithub-project-automationBot moved this from Goal: Merge to Done in Weekly GoalsDec 17, 2025
@tankyleo
tankyleo deleted the rust-jwt-auth branch December 17, 2025 17:14
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants

@tankyleo@ldk-reviews-bot@tnull@frnandu