< Summary

Information
Class: Elsa.Identity.Services.DefaultIdentityRefreshTokenService
Assembly: Elsa.Identity
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Services/DefaultIdentityRefreshTokenService.cs
Line coverage
89%
Covered lines: 25
Uncovered lines: 3
Coverable lines: 28
Total lines: 54
Line coverage: 89.2%
Branch coverage
57%
Covered branches: 15
Total branches: 26
Branch coverage: 57.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
RefreshAsync()57.69%282686.95%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Identity/Services/DefaultIdentityRefreshTokenService.cs

#LineLine coverage
 1using Elsa.Common.Multitenancy;
 2using Elsa.Identity.Constants;
 3using Elsa.Identity.Contracts;
 4using Elsa.Identity.Models;
 5using Elsa.Identity.Options;
 6using Microsoft.Extensions.Options;
 7using Microsoft.IdentityModel.JsonWebTokens;
 8
 9namespace Elsa.Identity.Services;
 10
 11/// <summary>
 12/// Validates and exchanges Elsa identity refresh tokens.
 13/// </summary>
 114public sealed class DefaultIdentityRefreshTokenService(
 115    IUserProvider userProvider,
 116    IAccessTokenIssuer accessTokenIssuer,
 117    ITenantAccessor tenantAccessor,
 118    IOptions<IdentityTokenOptions> identityTokenOptions) : IIdentityRefreshTokenService
 19{
 20    /// <inheritdoc />
 21    public async ValueTask<IssuedTokens?> RefreshAsync(string refreshToken, CancellationToken cancellationToken = defaul
 22    {
 223        if (string.IsNullOrWhiteSpace(refreshToken))
 024            return null;
 25
 226        var options = identityTokenOptions.Value;
 227        var validationResult = await new JsonWebTokenHandler().ValidateTokenAsync(refreshToken, options.CreateTokenValid
 28
 229        if (!validationResult.IsValid)
 030            return null;
 31
 232        var identity = validationResult.ClaimsIdentity;
 233        var tokenUse = identity.FindFirst(TokenUse.ClaimType)?.Value;
 34
 235        if (!string.Equals(tokenUse, TokenUse.Refresh, StringComparison.Ordinal))
 136            return null;
 37
 138        var userId = identity.FindFirst(JwtRegisteredClaimNames.Sub)?.Value;
 139        var userName = identity.FindFirst(JwtRegisteredClaimNames.Name)?.Value;
 40
 141        if (string.IsNullOrWhiteSpace(userId) && string.IsNullOrWhiteSpace(userName))
 042            return null;
 43
 144        var tenantId = identity.FindFirst(options.TenantIdClaimsType)?.Value;
 145        var tenant = string.IsNullOrWhiteSpace(tenantId) ? null : new Tenant { Id = tenantId, Name = tenantId };
 146        using var tenantContext = tenantAccessor.PushContext(tenant);
 147        var userFilter = string.IsNullOrWhiteSpace(userId)
 148            ? new UserFilter { Name = userName }
 149            : new UserFilter { Id = userId };
 150        var user = await userProvider.FindAsync(userFilter, cancellationToken);
 51
 152        return user is null ? null : await accessTokenIssuer.IssueTokensAsync(user, cancellationToken);
 253    }
 54}