Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add configurable JWTAudience claim #897

Merged
merged 4 commits into from
Mar 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions Box.V2.Test/BoxConfigTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,5 +85,30 @@ public void BoxConfig_SetBoxAccountApiHostUri()
Assert.AreEqual(newConfig.BoxAccountApiHostUri.ToString(), exampleUri + "/");
Assert.AreEqual(newConfig.AuthCodeBaseUri.ToString(), exampleUri + "/" + "oauth2/authorize");
}

[TestMethod]
public void BoxConfig_DefaultJWTAudience()
{
var exampleUri = new Uri("https://example.com/account");
var newConfig = new BoxConfigBuilder("", "")
.SetBoxApiHostUri(exampleUri)
.Build();

Assert.AreEqual(newConfig.JWTAudience, "https://api.box.com/oauth2/token");
}

[TestMethod]
public void BoxConfig_SetJWTAudience()
{
var exampleUri = new Uri("https://example.com/account");
var customAudience = "custom_audience/oauth2/token";
var newConfig = new BoxConfigBuilder("", "")
.SetBoxApiHostUri(exampleUri)
.SetJWTAudience(customAudience)
.Build();

Assert.AreEqual(newConfig.BoxApiHostUri.ToString(), exampleUri + "/");
Assert.AreEqual(newConfig.JWTAudience, customAudience);
}
}
}
12 changes: 12 additions & 0 deletions Box.V2/Config/BoxConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public BoxConfig(BoxConfigBuilder builder)
WebProxy = builder.WebProxy;
Timeout = builder.Timeout;
RetryStrategy = builder.RetryStrategy;
JWTAudience = builder.JWTAudience;
}

/// <summary>
Expand Down Expand Up @@ -155,6 +156,17 @@ public Uri BoxApiUri
private set { _boxApiUri = value; }
}

private string _jwtAudience;

/// <summary>
/// Audience claim for JWT token.
/// </summary>
public string JWTAudience
{
get { return _jwtAudience ?? Constants.BoxAuthTokenApiUriString; }
private set { _jwtAudience = value; }
}

public string ClientId { get; private set; }
public string ConsumerKey { get; private set; }
public string ClientSecret { get; private set; }
Expand Down
23 changes: 22 additions & 1 deletion Box.V2/Config/BoxConfigBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,17 @@ public BoxConfigBuilder SetRetryStrategy(IRetryStrategy retryStrategy)
return this;
}

/// <summary>
/// Sets audience claim used in JWT tokens.
/// </summary>
/// <param name="jwtAudience">Audience claim value</param>
/// <returns>this BoxConfigBuilder object for chaining</returns>
public BoxConfigBuilder SetJWTAudience(string jwtAudience)
{
_jwtAudience = jwtAudience;
return this;
}

public string ClientId { get; private set; }
public string ClientSecret { get; private set; }
public string EnterpriseId { get; private set; }
Expand All @@ -247,7 +258,6 @@ public BoxConfigBuilder SetRetryStrategy(IRetryStrategy retryStrategy)
public string JWTPublicKeyId { get; private set; }
public string UserAgent { get; private set; }


public Uri BoxApiHostUri { get; private set; } = new Uri(Constants.BoxApiHostUriString);
public Uri BoxAccountApiHostUri { get; private set; } = new Uri(Constants.BoxAccountApiHostUriString);
public Uri BoxUploadApiUri { get; private set; } = new Uri(new Uri(Constants.BoxUploadApiUriWithoutVersionString), Constants.BoxApiCurrentVersionUriString);
Expand Down Expand Up @@ -283,6 +293,17 @@ public Uri BoxApiUri
/// </summary>
public IRetryStrategy RetryStrategy { get; private set; } = new ExponentialBackoff();

private string _jwtAudience;

/// <summary>
/// Audience claim for JWT token.
/// </summary>
public string JWTAudience
{
get { return _jwtAudience ?? Constants.BoxAuthTokenApiUriString; }
private set { _jwtAudience = value; }
}

private Uri EnsureEndsWithSlash(Uri uri)
{
return uri.ToString().EndsWith("/") ? uri : new Uri($"{uri}{"/"}");
Expand Down
5 changes: 5 additions & 0 deletions Box.V2/Config/IBoxConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -146,5 +146,10 @@ public interface IBoxConfig
/// Retry strategy for failed requests
/// </summary>
IRetryStrategy RetryStrategy { get; }
/// <summary>
/// JWT token audience claim.
/// https://api.box.com/oauth2/token is used by default.
/// </summary>
string JWTAudience { get; }
}
}
2 changes: 1 addition & 1 deletion Box.V2/JWTAuth/BoxJWTAuth.cs
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ private string ConstructJWTAssertion(string sub, string boxSubType, DateTimeOffs
expireTime = nowOverride.Value.AddSeconds(30);
}

var payload = new JwtPayload(_boxConfig.ClientId, new Uri(Constants.BoxAuthTokenApiUriString).ToString(),
var payload = new JwtPayload(_boxConfig.ClientId, _boxConfig.JWTAudience,
claims, null, expireTime.LocalDateTime);

var header = new JwtHeader(signingCredentials: _credentials);
Expand Down