Skip to content

Commit

Permalink
feat: Add PssoPhoneNumberGrantValidator
Browse files Browse the repository at this point in the history
  • Loading branch information
wzh425 committed Mar 8, 2024
1 parent 44c4cc8 commit 059fa1e
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
<PackageReference Include="Magicodes.IE.Csv" Version="2.6.4" />
<PackageReference Include="Masa.BuildingBlocks.Authentication.OpenIdConnect.Domain" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.BuildingBlocks.Authentication.OpenIdConnect.Models" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.BuildingBlocks.StackSdks.Auth.Contracts" Version="1.0.1-preview.11" />
<PackageReference Include="Masa.BuildingBlocks.StackSdks.Auth.Contracts" Version="1.0.1-preview.12" />
<!--<PackageReference Include="Masa.BuildingBlocks.StackSdks.Auth.Contracts" Version="$(MasaFrameworkPackageVersion)" />-->
<PackageReference Include="Masa.Contrib.Configuration.ConfigurationApi.Dcc" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.Caching.Distributed.StackExchangeRedis" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.SearchEngine.AutoComplete.ElasticSearch" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.StackSdks.Auth" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.StackSdks.Auth" Version="1.0.1-preview.12" />
<PackageReference Include="Masa.Utils.Extensions.Enums" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Utils.Extensions.Validations.FluentValidation" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Copyright (c) MASA Stack All rights reserved.
// Licensed under the Apache License. See LICENSE.txt in the project root for license information.

namespace Masa.Auth.Service.Admin.Application.Subjects.Queries;

public record ThirdPartyUserByUserIdQuery(Guid UserId, Guid ThirdPartyIdpId) : Query<UserModel?>
{
public override UserModel? Result { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,22 @@ public async Task GetThirdPartyUserAsync(ThirdPartyUserQuery query)
query.Result = userModel;
}

[EventHandler]
public async Task GetThirdPartyUserByUserIdAsync(ThirdPartyUserByUserIdQuery query)
{
var tpUser = await _authDbContext.Set<ThirdPartyUser>()
.Include(tpu => tpu.User)
.FirstOrDefaultAsync(tpu => tpu.ThirdPartyIdpId == query.ThirdPartyIdpId && tpu.UserId == query.UserId);
var userModel = tpUser?.User?.Adapt<UserModel>();

if (tpUser != null && tpUser.User != null && userModel != null)
{
userModel.ClaimData = tpUser.ClaimData;
}

query.Result = userModel;
}

#endregion

#region ThirdPartyIdp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ private async Task<ThirdPartyUserDetailDto> GetDetailAsync(IEventBus eventBus, [
return query.Result;
}

[AllowAnonymous]
private async Task<UserModel?> GetByUserIdAsync(IEventBus eventBus, [FromQuery] string scheme, Guid userId)
{
var identityProviderQuery = new IdentityProviderBySchemeQuery(scheme);
await eventBus.PublishAsync(identityProviderQuery);
var identityProvider = identityProviderQuery.Result;

var query = new ThirdPartyUserByUserIdQuery(userId, identityProvider.Id);
await eventBus.PublishAsync(query);
return query.Result;
}

private async Task<UserModel> UpsertThirdPartyUserExternalAsync(IEventBus eventBus, UpsertThirdPartyUserModel model)
{
var query = new UpsertThirdPartyUserExternalCommand(model);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// Copyright (c) MASA Stack All rights reserved.
// Licensed under the Apache License. See LICENSE.txt in the project root for license information.

namespace Masa.Auth.Web.Sso.Infrastructure.Validations;

public class PssoPhoneNumberGrantValidator : IExtensionGrantValidator
{
IAuthClient _authClient;
LocalLoginByPhoneNumberAgent _localLoginByPhoneNumber;

public string GrantType { get; } = "psso_phone";

public PssoPhoneNumberGrantValidator(IAuthClient authClient, LocalLoginByPhoneNumberAgent localLoginByPhoneNumber)
{
_authClient = authClient;
_localLoginByPhoneNumber = localLoginByPhoneNumber;
}

public async Task ValidateAsync(ExtensionGrantValidationContext context)
{
var phoneNumber = context.Request.Raw["PhoneNumber"];
var spToken = context.Request.Raw["SpToken"];
if (string.IsNullOrEmpty(phoneNumber) || string.IsNullOrEmpty(spToken))
{
context.Result = new GrantValidationResult
{
IsError = true,
Error = "Must provide phone number and spToken",
ErrorDescription = "Must provide phone number and spToken"
};
return;
}

var (success, errorMsg) = await _localLoginByPhoneNumber.VerifyPhoneWithTokenAsync(phoneNumber, spToken);
if (success)
{
var user = await _authClient.UserService.GetByPhoneNumberAsync(phoneNumber);
if (user is null)
{
context.Result = new GrantValidationResult
{
IsError = true,
Error = $"User {phoneNumber} does not exist",
ErrorDescription = errorMsg
};
}
else
{
var authUser = await _authClient.UserService.GetThirdPartyUserByUserIdAsync(new GetThirdPartyUserByUserIdModel
{
Scheme = "Psso",
UserId = user.Id
});

var claims = new List<Claim>();
if (authUser != null)
{
foreach (var item in authUser.ClaimData)
{
claims.Add(new Claim(item.Key, item.Value));
}
}

context.Result = new GrantValidationResult(user.Id.ToString(), "local", claims);
}
}
else
context.Result = new GrantValidationResult
{
IsError = true,
Error = errorMsg,
ErrorDescription = errorMsg
};
}
}
2 changes: 1 addition & 1 deletion src/Web/Masa.Auth.Web.Sso/Masa.Auth.Web.Sso.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
<PackageReference Include="Masa.Contrib.Development.DaprStarter.AspNetCore" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.StackSdks.Caller" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.StackSdks.Config" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.StackSdks.Auth" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.StackSdks.Auth" Version="1.0.1-preview.12" />
<PackageReference Include="Masa.Contrib.StackSdks.Mc" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.StackSdks.Pm" Version="$(MasaFrameworkPackageVersion)" />
<PackageReference Include="Masa.Contrib.StackSdks.Tsc.OpenTelemetry" Version="$(MasaFrameworkPackageVersion)" />
Expand Down

0 comments on commit 059fa1e

Please sign in to comment.