identity server client for auth

This commit is contained in:
Kyle Spearrin 2017-05-06 20:20:57 -04:00
parent 7117f00480
commit d1cf6c68f3
15 changed files with 84 additions and 23 deletions

View file

@ -7,6 +7,7 @@ namespace Bit.Android.Services
{ {
public class HttpService : IHttpService public class HttpService : IHttpService
{ {
public ApiHttpClient Client => new ApiHttpClient(new AndroidClientHandler()); public ApiHttpClient ApiClient => new ApiHttpClient(new AndroidClientHandler());
public IdentityHttpClient IdentityClient => new IdentityHttpClient(new AndroidClientHandler());
} }
} }

View file

@ -2,6 +2,7 @@
{ {
public interface IHttpService public interface IHttpService
{ {
ApiHttpClient Client { get; } ApiHttpClient ApiClient { get; }
IdentityHttpClient IdentityClient { get; }
} }
} }

View file

@ -9,6 +9,7 @@ namespace Bit.App.Abstractions
[Obsolete("Old auth scheme")] [Obsolete("Old auth scheme")]
string AuthBearer { get; set; } string AuthBearer { get; set; }
DateTime TokenExpiration { get; } DateTime TokenExpiration { get; }
string TokenIssuer { get; }
bool TokenExpired { get; } bool TokenExpired { get; }
TimeSpan TokenTimeRemaining { get; } TimeSpan TokenTimeRemaining { get; }
bool TokenNeedsRefresh { get; } bool TokenNeedsRefresh { get; }

View file

@ -229,6 +229,7 @@
<Compile Include="Pages\Vault\VaultEditLoginPage.cs" /> <Compile Include="Pages\Vault\VaultEditLoginPage.cs" />
<Compile Include="Pages\Vault\VaultListLoginsPage.cs" /> <Compile Include="Pages\Vault\VaultListLoginsPage.cs" />
<Compile Include="Services\PasswordGenerationService.cs" /> <Compile Include="Services\PasswordGenerationService.cs" />
<Compile Include="Utilities\IdentityHttpClient.cs" />
<Compile Include="Utilities\Extentions.cs" /> <Compile Include="Utilities\Extentions.cs" />
<Compile Include="Utilities\ExtendedObservableCollection.cs" /> <Compile Include="Utilities\ExtendedObservableCollection.cs" />
<Compile Include="Utilities\ApiHttpClient.cs" /> <Compile Include="Utilities\ApiHttpClient.cs" />

View file

@ -28,7 +28,7 @@ namespace Bit.App.Repositories
return HandledNotConnected(); return HandledNotConnected();
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage(requestObj) var requestMessage = new TokenHttpRequestMessage(requestObj)
{ {
@ -60,7 +60,7 @@ namespace Bit.App.Repositories
return HandledNotConnected(); return HandledNotConnected();
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage(requestObj) var requestMessage = new TokenHttpRequestMessage(requestObj)
{ {
@ -98,7 +98,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage() var requestMessage = new TokenHttpRequestMessage()
{ {
@ -147,7 +147,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage() var requestMessage = new TokenHttpRequestMessage()
{ {
@ -187,7 +187,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage() var requestMessage = new TokenHttpRequestMessage()
{ {

View file

@ -35,7 +35,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage() var requestMessage = new TokenHttpRequestMessage()
{ {
@ -75,7 +75,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage() var requestMessage = new TokenHttpRequestMessage()
{ {
@ -115,7 +115,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage(requestObj) var requestMessage = new TokenHttpRequestMessage(requestObj)
{ {
@ -155,7 +155,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage(requestObj) var requestMessage = new TokenHttpRequestMessage(requestObj)
{ {
@ -195,7 +195,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage() var requestMessage = new TokenHttpRequestMessage()
{ {

View file

@ -55,7 +55,7 @@ namespace Bit.App.Repositories
var deviceInfoService = Resolver.Resolve<IDeviceInfoService>(); var deviceInfoService = Resolver.Resolve<IDeviceInfoService>();
var appIdService = Resolver.Resolve<IAppIdService>(); var appIdService = Resolver.Resolve<IAppIdService>();
using(var client = HttpService.Client) using(var client = HttpService.IdentityClient)
{ {
var requestMessage = new HttpRequestMessage var requestMessage = new HttpRequestMessage
{ {
@ -97,7 +97,7 @@ namespace Bit.App.Repositories
} }
else if(TokenService.TokenNeedsRefresh && !string.IsNullOrWhiteSpace(TokenService.RefreshToken)) else if(TokenService.TokenNeedsRefresh && !string.IsNullOrWhiteSpace(TokenService.RefreshToken))
{ {
using(var client = HttpService.Client) using(var client = HttpService.IdentityClient)
{ {
var requestMessage = new HttpRequestMessage var requestMessage = new HttpRequestMessage
{ {

View file

@ -32,7 +32,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage() var requestMessage = new TokenHttpRequestMessage()
{ {
@ -72,7 +72,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage() var requestMessage = new TokenHttpRequestMessage()
{ {

View file

@ -29,7 +29,7 @@ namespace Bit.App.Repositories
return HandledNotConnected<TokenResponse>(); return HandledNotConnected<TokenResponse>();
} }
using(var client = HttpService.Client) using(var client = HttpService.IdentityClient)
{ {
var requestMessage = new HttpRequestMessage var requestMessage = new HttpRequestMessage
{ {

View file

@ -33,7 +33,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage(request) var requestMessage = new TokenHttpRequestMessage(request)
{ {
@ -65,7 +65,7 @@ namespace Bit.App.Repositories
return HandledNotConnected(); return HandledNotConnected();
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage var requestMessage = new TokenHttpRequestMessage
{ {

View file

@ -32,7 +32,7 @@ namespace Bit.App.Repositories
return tokenStateResponse; return tokenStateResponse;
} }
using(var client = HttpService.Client) using(var client = HttpService.ApiClient)
{ {
var requestMessage = new TokenHttpRequestMessage() var requestMessage = new TokenHttpRequestMessage()
{ {

View file

@ -1,7 +1,6 @@
using System; using System;
using Bit.App.Abstractions; using Bit.App.Abstractions;
using System.Text; using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Bit.App.Services namespace Bit.App.Services
@ -77,6 +76,20 @@ namespace Bit.App.Services
} }
} }
public string TokenIssuer
{
get
{
var decoded = DecodeToken();
if(decoded?["iss"] == null)
{
throw new InvalidOperationException("No issuer in token.");
}
return decoded?["iss"].Value<string>();
}
}
public bool TokenExpired => DateTime.UtcNow < TokenExpiration; public bool TokenExpired => DateTime.UtcNow < TokenExpiration;
public TimeSpan TokenTimeRemaining => TokenExpiration - DateTime.UtcNow; public TimeSpan TokenTimeRemaining => TokenExpiration - DateTime.UtcNow;
public bool TokenNeedsRefresh => TokenTimeRemaining.TotalMinutes < 5; public bool TokenNeedsRefresh => TokenTimeRemaining.TotalMinutes < 5;

View file

@ -0,0 +1,29 @@
using System.Net.Http;
using System;
using System.Net.Http.Headers;
namespace Bit.App
{
public class IdentityHttpClient : HttpClient
{
public IdentityHttpClient()
{
Init();
}
public IdentityHttpClient(HttpMessageHandler handler)
: base(handler)
{
Init();
}
private void Init()
{
//BaseAddress = new Uri("http://169.254.80.80:33656"); // Desktop from VS Android Emulator
//BaseAddress = new Uri("http://192.168.1.8:33656"); // Desktop
//BaseAddress = new Uri("https://identity-api.bitwarden.com"); // Preview
BaseAddress = new Uri("https://api.bitwarden.com"); // Production
DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
}
}

View file

@ -12,9 +12,23 @@ namespace Bit.App
{ {
var tokenService = Resolver.Resolve<ITokenService>(); var tokenService = Resolver.Resolve<ITokenService>();
var appIdService = Resolver.Resolve<IAppIdService>(); var appIdService = Resolver.Resolve<IAppIdService>();
if(!string.IsNullOrWhiteSpace(tokenService.Token)) if(!string.IsNullOrWhiteSpace(tokenService.Token))
{ {
Headers.Add("Authorization", $"Bearer2 {tokenService.Token}"); var httpService = Resolver.Resolve<IHttpService>();
var bearerString = "Bearer";
var tokenIssuer = tokenService.TokenIssuer;
if(tokenIssuer == httpService.ApiClient.BaseAddress.OriginalString)
{
bearerString = string.Concat(bearerString, "2");
}
else if(tokenIssuer == httpService.IdentityClient.BaseAddress.OriginalString)
{
bearerString = string.Concat(bearerString, "3");
}
Headers.Add("Authorization", $"{bearerString} {tokenService.Token}");
} }
if(!string.IsNullOrWhiteSpace(appIdService.AppId)) if(!string.IsNullOrWhiteSpace(appIdService.AppId))
{ {

View file

@ -6,6 +6,7 @@ namespace Bit.iOS.Core.Services
{ {
public class HttpService : IHttpService public class HttpService : IHttpService
{ {
public ApiHttpClient Client => new ApiHttpClient(); public ApiHttpClient ApiClient => new ApiHttpClient();
public IdentityHttpClient IdentityClient => new IdentityHttpClient();
} }
} }