Skip to content

Commit 7c8d671

Browse files
committed
Completed Identity integration
1 parent 9ec4310 commit 7c8d671

16 files changed

Lines changed: 6011 additions & 67 deletions

File tree

eShopOnContainers.sln

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "eShopOnContainers.Identity"
7373
EndProject
7474
Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "FunctionalTests", "test\Services\FunctionalTests\FunctionalTests.xproj", "{621E7211-58D0-45FD-9600-1CB490BD930E}"
7575
EndProject
76+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eShopOnContainers.UITests", "src\Mobile\eShopOnContainers\eShopOnContainers.UITests\eShopOnContainers.UITests.csproj", "{E3B18084-842C-4B80-8E4A-A7E588EC3137}"
77+
EndProject
7678
Global
7779
GlobalSection(SolutionConfigurationPlatforms) = preSolution
7880
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@@ -905,6 +907,54 @@ Global
905907
{621E7211-58D0-45FD-9600-1CB490BD930E}.Release|x64.Build.0 = Release|Any CPU
906908
{621E7211-58D0-45FD-9600-1CB490BD930E}.Release|x86.ActiveCfg = Release|Any CPU
907909
{621E7211-58D0-45FD-9600-1CB490BD930E}.Release|x86.Build.0 = Release|Any CPU
910+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
911+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU
912+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|ARM.ActiveCfg = Release|Any CPU
913+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|ARM.Build.0 = Release|Any CPU
914+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU
915+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU
916+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU
917+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU
918+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|x64.ActiveCfg = Release|Any CPU
919+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|x64.Build.0 = Release|Any CPU
920+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU
921+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Ad-Hoc|x86.Build.0 = Release|Any CPU
922+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
923+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|Any CPU.Build.0 = Release|Any CPU
924+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|ARM.ActiveCfg = Release|Any CPU
925+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|ARM.Build.0 = Release|Any CPU
926+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|iPhone.ActiveCfg = Release|Any CPU
927+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|iPhone.Build.0 = Release|Any CPU
928+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU
929+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU
930+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|x64.ActiveCfg = Release|Any CPU
931+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|x64.Build.0 = Release|Any CPU
932+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|x86.ActiveCfg = Release|Any CPU
933+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.AppStore|x86.Build.0 = Release|Any CPU
934+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
935+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|Any CPU.Build.0 = Debug|Any CPU
936+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|ARM.ActiveCfg = Debug|Any CPU
937+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|ARM.Build.0 = Debug|Any CPU
938+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|iPhone.ActiveCfg = Debug|Any CPU
939+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|iPhone.Build.0 = Debug|Any CPU
940+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
941+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
942+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|x64.ActiveCfg = Debug|Any CPU
943+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|x64.Build.0 = Debug|Any CPU
944+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|x86.ActiveCfg = Debug|Any CPU
945+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Debug|x86.Build.0 = Debug|Any CPU
946+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|Any CPU.ActiveCfg = Release|Any CPU
947+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|Any CPU.Build.0 = Release|Any CPU
948+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|ARM.ActiveCfg = Release|Any CPU
949+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|ARM.Build.0 = Release|Any CPU
950+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|iPhone.ActiveCfg = Release|Any CPU
951+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|iPhone.Build.0 = Release|Any CPU
952+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
953+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
954+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|x64.ActiveCfg = Release|Any CPU
955+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|x64.Build.0 = Release|Any CPU
956+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|x86.ActiveCfg = Release|Any CPU
957+
{E3B18084-842C-4B80-8E4A-A7E588EC3137}.Release|x86.Build.0 = Release|Any CPU
908958
EndGlobalSection
909959
GlobalSection(SolutionProperties) = preSolution
910960
HideSolutionNode = FALSE
@@ -939,5 +989,6 @@ Global
939989
{02DF7FEE-C302-433D-A6CD-237A2569F236} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
940990
{A579E108-5445-403D-A407-339AC4D1611B} = {02DF7FEE-C302-433D-A6CD-237A2569F236}
941991
{621E7211-58D0-45FD-9600-1CB490BD930E} = {EF0337F2-ED00-4643-89FD-EE10863F1870}
992+
{E3B18084-842C-4B80-8E4A-A7E588EC3137} = {B7B1D395-4E06-4036-BE86-C216756B9367}
942993
EndGlobalSection
943994
EndGlobal

src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public string BaseEndpoint
4444

4545
public string IdentityCallback { get; set; }
4646

47+
public string LogoutCallback { get; set; }
48+
4749
private void UpdateEndpoint(string baseEndpoint)
4850
{
4951
RegisterWebsite = string.Format("{0}/Account/Register", baseEndpoint);
@@ -54,6 +56,7 @@ private void UpdateEndpoint(string baseEndpoint)
5456
UserInfoEndpoint = string.Format("{0}:5105/connect/userinfo", baseEndpoint);
5557
LogoutEndpoint = string.Format("{0}:5105/connect/endsession", baseEndpoint);
5658
IdentityCallback = "http://eshopxamarin/callback.html";
59+
LogoutCallback = "http://eshopxamarin/callback.html/index.html";
5760
}
5861
}
5962
}

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ private static ISettings AppSettings
2121
#region Setting Constants
2222

2323
private const string AccessToken = "access_token";
24+
private const string IdToken = "id_token";
2425
private static readonly string AccessTokenDefault = string.Empty;
26+
private static readonly string IdTokenDefault = string.Empty;
2527

2628
#endregion
2729

@@ -37,5 +39,17 @@ public static string AuthAccessToken
3739
AppSettings.AddOrUpdateValue<string>(AccessToken, value);
3840
}
3941
}
42+
43+
public static string AuthIdToken
44+
{
45+
get
46+
{
47+
return AppSettings.GetValueOrDefault<string>(IdToken, IdTokenDefault);
48+
}
49+
set
50+
{
51+
AppSettings.AddOrUpdateValue<string>(IdToken, value);
52+
}
53+
}
4054
}
4155
}

src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Identity/IdentityService.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,15 @@ public string CreateAuthorizeRequest()
3535

3636
public string CreateLogoutRequest(string token)
3737
{
38+
if(string.IsNullOrEmpty(token))
39+
{
40+
return string.Empty;
41+
}
42+
3843
return string.Format("{0}?id_token_hint={1}&post_logout_redirect_uri={2}",
3944
GlobalSetting.Instance.LogoutEndpoint,
4045
token,
41-
GlobalSetting.Instance.IdentityCallback);
46+
GlobalSetting.Instance.LogoutCallback);
4247
}
4348

4449
public string DecodeToken(string token)

src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,6 @@ protected ViewModelLocator()
6363

6464
public void UpdateDependencies(bool useMockServices)
6565
{
66-
// Clear message subscriptions
67-
var basketViewModel = _unityContainer.Resolve<BasketViewModel>();
68-
MessagingCenter.Unsubscribe<CatalogViewModel, List<BasketItem>>(basketViewModel, MessengerKeys.UpdateBasket);
69-
MessagingCenter.Unsubscribe<CatalogViewModel, CatalogItem>(basketViewModel, MessengerKeys.AddProduct);
70-
7166
// Change injected dpendencies
7267
if (useMockServices)
7368
{

src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,13 @@ public decimal Total
6565
public ICommand AddCommand => new Command<BasketItem>(AddItem);
6666

6767
public ICommand CheckoutCommand => new Command(Checkout);
68-
68+
6969
public override Task InitializeAsync(object navigationData)
7070
{
71+
if (BasketItems == null)
72+
BasketItems = new ObservableCollection<BasketItem>();
73+
74+
MessagingCenter.Unsubscribe<CatalogViewModel, List<BasketItem>>(this, MessengerKeys.UpdateBasket);
7175
MessagingCenter.Subscribe<CatalogViewModel, List<BasketItem>>(this, MessengerKeys.UpdateBasket, (sender, arg) =>
7276
{
7377
foreach (var basketItem in arg)
@@ -77,15 +81,14 @@ public override Task InitializeAsync(object navigationData)
7781
}
7882
});
7983

84+
MessagingCenter.Unsubscribe<CatalogViewModel, CatalogItem>(this, MessengerKeys.AddProduct);
8085
MessagingCenter.Subscribe<CatalogViewModel, CatalogItem>(this, MessengerKeys.AddProduct, (sender, arg) =>
8186
{
8287
BadgeCount++;
8388

8489
AddCatalogItem(arg);
8590
});
8691

87-
BasketItems = new ObservableCollection<BasketItem>();
88-
8992
return base.InitializeAsync(navigationData);
9093
}
9194

src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,15 @@ public override async Task InitializeAsync(object navigationData)
100100
{
101101
IsBusy = true;
102102

103+
// Get Catalog, Brands and Types
103104
Products = await _productsService.GetCatalogAsync();
104105
Brands = await _productsService.GetCatalogBrandAsync();
105106
Types = await _productsService.GetCatalogTypeAsync();
106107

107108
var authToken = Settings.AuthAccessToken;
108109
var userInfo = await _userService.GetUserInfoAsync(authToken);
109110

111+
// Update Basket
110112
var basket = await _basketService.GetBasketAsync(userInfo.UserId, authToken);
111113

112114
if (basket != null && basket.Items.Any())
@@ -131,6 +133,7 @@ private async void Filter()
131133

132134
IsBusy = true;
133135

136+
// Filter
134137
MessagingCenter.Send(this, MessengerKeys.Filter);
135138
Products = await _productsService.FilterAsync(Brand.Id, Type.Id);
136139

src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,15 @@ public override async Task InitializeAsync(object navigationData)
7474
{
7575
IsBusy = true;
7676

77+
// Get navigation data
7778
var orderItems = ((ObservableCollection<BasketItem>)navigationData);
7879

7980
OrderItems = orderItems;
8081

8182
var authToken = Settings.AuthAccessToken;
8283
var userInfo = await _userService.GetUserInfoAsync(authToken);
8384

85+
// Create Shipping Address
8486
ShippingAddress = new Address
8587
{
8688
Id = new Guid(userInfo.UserId),
@@ -91,6 +93,7 @@ public override async Task InitializeAsync(object navigationData)
9193
City = string.Empty
9294
};
9395

96+
// Create Payment Info
9497
var paymentInfo = new PaymentInfo
9598
{
9699
CardNumber = userInfo?.CardNumber,
@@ -99,6 +102,7 @@ public override async Task InitializeAsync(object navigationData)
99102
SecurityNumber = userInfo?.CardSecurityNumber
100103
};
101104

105+
// Create new Order
102106
Order = new Order
103107
{
104108
BuyerId = userInfo.UserId,
@@ -123,17 +127,32 @@ public override async Task InitializeAsync(object navigationData)
123127

124128
private async void Checkout()
125129
{
126-
var authToken = Settings.AuthAccessToken;
130+
try
131+
{
132+
var authToken = Settings.AuthAccessToken;
133+
134+
// Create new order
135+
await _orderService.CreateOrderAsync(Order, authToken);
136+
137+
// Clean Basket
138+
await _basketService.ClearBasketAsync(_shippingAddress.Id.ToString(), authToken);
127139

128-
await _orderService.CreateOrderAsync(Order, authToken);
140+
// Reset Basket badge
141+
var basketViewModel = ViewModelLocator.Instance.Resolve<BasketViewModel>();
142+
basketViewModel.BadgeCount = 0;
129143

130-
await _basketService.ClearBasketAsync(_shippingAddress.Id.ToString(), authToken);
131-
132-
await NavigationService.NavigateToAsync<MainViewModel>(new TabParameter { TabIndex = 1 });
133-
await NavigationService.RemoveLastFromBackStackAsync();
144+
// Navigate to Orders
145+
await NavigationService.NavigateToAsync<MainViewModel>(new TabParameter { TabIndex = 1 });
146+
await NavigationService.RemoveLastFromBackStackAsync();
134147

135-
await DialogService.ShowAlertAsync("Order sent successfully!", string.Format("Order {0}", Order.OrderNumber), "Ok");
136-
await NavigationService.RemoveLastFromBackStackAsync();
148+
// Show Dialog
149+
await DialogService.ShowAlertAsync("Order sent successfully!", string.Format("Order {0}", Order.OrderNumber), "Ok");
150+
await NavigationService.RemoveLastFromBackStackAsync();
151+
}
152+
catch
153+
{
154+
await DialogService.ShowAlertAsync("An error ocurred. Please, try again.", "Oops!", "Ok");
155+
}
137156
}
138157

139158
private List<OrderItem> CreateOrderItems(ObservableCollection<BasketItem> basketItems)

src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@ private async Task SignInAsync()
190190

191191
IsValid = true;
192192
IsLogin = true;
193-
194193
IsBusy = false;
195194
}
196195

@@ -201,28 +200,36 @@ private void Register()
201200

202201
private void Logout()
203202
{
204-
var token = Settings.AuthAccessToken;
205-
var logoutRequest = _identityService.CreateLogoutRequest(token);
203+
var authIdToken = Settings.AuthIdToken;
204+
205+
var logoutRequest = _identityService.CreateLogoutRequest(authIdToken);
206206

207207
if(!string.IsNullOrEmpty(logoutRequest))
208208
{
209+
// Logout
209210
LoginUrl = logoutRequest;
210-
Settings.AuthAccessToken = string.Empty;
211-
IsLogin = true;
212211
}
213212
}
214213

215214
private async void NavigateAsync(string url)
216215
{
217-
if (url.Contains(GlobalSetting.Instance.IdentityCallback))
216+
if (url.Equals(GlobalSetting.Instance.LogoutCallback))
217+
{
218+
Settings.AuthAccessToken = string.Empty;
219+
Settings.AuthIdToken = string.Empty;
220+
IsLogin = false;
221+
LoginUrl = _identityService.CreateAuthorizeRequest();
222+
}
223+
else if (url.Contains(GlobalSetting.Instance.IdentityCallback))
218224
{
219225
var authResponse = new AuthorizeResponse(url);
220226

221227
if (!string.IsNullOrWhiteSpace(authResponse.AccessToken))
222228
{
223-
if(authResponse.AccessToken != null)
229+
if (authResponse.AccessToken != null)
224230
{
225231
Settings.AuthAccessToken = authResponse.AccessToken;
232+
Settings.AuthIdToken = authResponse.IdentityToken;
226233

227234
await NavigationService.NavigateToAsync<MainViewModel>();
228235
await NavigationService.RemoveLastFromBackStackAsync();

src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public override Task InitializeAsync(object navigationData)
1717

1818
if (navigationData is TabParameter)
1919
{
20+
// Change selected application tab
2021
var tabIndex = ((TabParameter)navigationData).TabIndex;
2122
MessagingCenter.Send(this, MessengerKeys.ChangeTab, tabIndex);
2223
}

0 commit comments

Comments
 (0)