public SignalRClientService( ILogger <SignalRClientService> logger, IApplicationLifetime applicationLifetime, IAuthService authService, IAccountService accountService, IAccountMQPublisher accountMQPublisher, IOptions <SecuritySettings> securityOptions) { this.accountService = accountService; this.authService = authService; this.logger = logger; this.securitySettings = securityOptions.Value; this.appLifetime = applicationLifetime; this.accountMQPublisher = accountMQPublisher; // Setup SignalR Hub connection string accessToken = JWTokenHandler.GenerateToken(securitySettings.ClientIdentifier, securitySettings.Secret); hubConnectionAuth = new HubConnectionBuilder() .WithUrl("https://localhost:44380/authhub", options => options.AccessTokenProvider = () => Task.FromResult <string>(accessToken)) .Build(); hubConnectionAccount = new HubConnectionBuilder() .WithUrl("https://localhost:44380/accounthub", options => options.AccessTokenProvider = () => Task.FromResult <string>(accessToken)) .Build(); }
// TODO: Handle all the custom mapping (Db to Dto models) - probably by creating a IMapper? public AccountDto Authenticate(AccountDto accountDto, string secret) { var account = dbContext.Accounts .Where(a => a.PhoneNumber == accountDto.PhoneNumber) .Include(a => a.CallingCodeObj) .Include(a => a.Contacts) .ThenInclude(c => c.ContactAccount) .SingleOrDefault(); if (account == null) { return(null); } // Update token // TODO - check db, and also start using countrycode + phonenumber AuthToken token = dbContext.AuthTokens.Where(at => at.AccountId == account.Id).SingleOrDefault(); if (token == null) { token = new AuthToken { AccountId = account.Id }; } token.Value = JWTokenHandler.GenerateToken(account.PhoneNumber, secret); dbContext.SaveChangesAsync(); return(new AccountDto { Firstname = account.Firstname, Lastname = account.Lastname, Email = account.Email, PhoneNumber = account.PhoneNumber, CallingCountryCode = account.CallingCodeObj.CallingCountryCode, DateRegistered = account.DateRegistered, Token = token.Value, AvatarImageUrl = account.AvatarImageUrl, CoverImageUrl = account.CoverImageUrl, CreateSession = true, Contacts = account.Contacts? .Select(c => new ContactDto { DateAdded = c.DateAdded, ContactName = c.ContactName, AvatarImageUrl = c.ContactAccount.AvatarImageUrl, CoverImageUrl = c.ContactAccount.CoverImageUrl, ContactPhoneNumber = c.ContactAccount.PhoneNumber, ContactAccountId = c.ContactAccountId, IsFavorite = c.IsFavorite }) .OrderBy(c => c.ContactName) .ToList() }); }
public BaseHubClientService(IOptions <GatewayBaseSettings> gatewayBaseOptions, IOptions <SecuritySettings> securityOptions, string hubEndpoint) { this.securitySettings = securityOptions.Value; GatewayBaseSettings gatewayBaseSettings = gatewayBaseOptions.Value; string connectionBaseUrl = gatewayBaseSettings.Scheme + "://" + gatewayBaseSettings.Url + ":" + gatewayBaseSettings.Port; string accessToken = JWTokenHandler.GenerateToken(securitySettings.ClientIdentifier, securitySettings.Secret); hubConnection = new HubConnectionBuilder() .WithUrl(connectionBaseUrl + "/" + hubEndpoint, options => options.AccessTokenProvider = () => Task.FromResult <string>(accessToken)) .Build(); }
public async Task <AccountDto> Registration(AccountDto accountDto, string secret) { Account account = dbContext.Accounts .Where(a => a.PhoneNumber == accountDto.PhoneNumber && a.CallingCountryCode == accountDto.CallingCountryCode) .SingleOrDefault(); if (account != null) { return(null); } account = new Account { Firstname = accountDto.Firstname, Lastname = accountDto.Lastname, Email = accountDto.Email, PhoneNumber = accountDto.PhoneNumber, CallingCodeObj = await dbContext.CallingCode.Where(cc => cc.CallingCountryCode == accountDto.CallingCountryCode).SingleOrDefaultAsync() }; if (accountDto.Contacts?.Count > 0) { // add as contacts those accounts that exist (TODO: Change to consider country prefix and possible '0' infront of phone number) var dtoContacts = accountDto.Contacts.Select(dto => dto.ContactPhoneNumber).ToList(); List <Account> contactsToAdd = dbContext.Accounts .Where(a => dtoContacts.Contains(a.PhoneNumber)) .ToList(); account.Contacts = contactsToAdd.Select(a => new Contact { Account = account, ContactAccountId = a.Id, ContactName = accountDto.Contacts.SingleOrDefault(c => c.ContactPhoneNumber == a.PhoneNumber)?.ContactName }) .ToList(); } // TODO: Generate a Token (on Prod this will be a phone/sms code confirmation ~ on Dev think about how to implement this) var token = new AuthToken { Account = account, Value = JWTokenHandler.GenerateToken(account.PhoneNumber, secret) }; dbContext.Accounts.Add(account); dbContext.AuthTokens.Add(token); await dbContext.SaveChangesAsync(); return(new AccountDto { Firstname = account.Firstname, Lastname = account.Lastname, Email = account.Email, PhoneNumber = account.PhoneNumber, CallingCountryCode = account.CallingCodeObj.CallingCountryCode, DateRegistered = account.DateRegistered, Token = token.Value, CreateSession = true, Contacts = account.Contacts?.Select(c => new ContactDto { DateAdded = c.DateAdded, ContactName = c.ContactName, AvatarImageUrl = c.ContactAccount.AvatarImageUrl, CoverImageUrl = c.ContactAccount.CoverImageUrl, ContactPhoneNumber = c.ContactAccount.PhoneNumber, ContactAccountId = c.ContactAccountId }).ToList() }); }