AuthenticationProviderManager.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/std/smart_ptr/make_shared.h>
  9. #include <AzCore/IO/FileIO.h>
  10. #include <Authentication/AuthenticationProviderTypes.h>
  11. #include <Authentication/AWSCognitoAuthenticationProvider.h>
  12. #include <Authentication/LWAAuthenticationProvider.h>
  13. #include <Authentication/GoogleAuthenticationProvider.h>
  14. #include <Authentication/AuthenticationProviderManager.h>
  15. namespace AWSClientAuth
  16. {
  17. AuthenticationProviderManager::AuthenticationProviderManager()
  18. {
  19. AZ::Interface<IAuthenticationProviderRequests>::Register(this);
  20. AuthenticationProviderRequestBus::Handler::BusConnect();
  21. AuthenticationProviderScriptCanvasRequestBus::Handler::BusConnect();
  22. }
  23. AuthenticationProviderManager::~AuthenticationProviderManager()
  24. {
  25. ResetProviders();
  26. AuthenticationProviderScriptCanvasRequestBus::Handler::BusDisconnect();
  27. AuthenticationProviderRequestBus::Handler::BusDisconnect();
  28. AZ::Interface<IAuthenticationProviderRequests>::Unregister(this);
  29. }
  30. bool AuthenticationProviderManager::Initialize(const AZStd::vector<ProviderNameEnum>& providerNames)
  31. {
  32. ResetProviders();
  33. bool initializeSuccess = true;
  34. for (auto providerName : providerNames)
  35. {
  36. m_authenticationProvidersMap[providerName] = CreateAuthenticationProviderObject(providerName);
  37. initializeSuccess = initializeSuccess && m_authenticationProvidersMap[providerName]->Initialize();
  38. }
  39. return initializeSuccess;
  40. }
  41. void AuthenticationProviderManager::PasswordGrantSingleFactorSignInAsync(const ProviderNameEnum& providerName, const AZStd::string& username, const AZStd::string& password)
  42. {
  43. if (IsProviderInitialized(providerName))
  44. {
  45. m_authenticationProvidersMap[providerName]->PasswordGrantSingleFactorSignInAsync(username, password);
  46. }
  47. }
  48. void AuthenticationProviderManager::PasswordGrantMultiFactorSignInAsync(const ProviderNameEnum& providerName, const AZStd::string& username, const AZStd::string& password)
  49. {
  50. if (IsProviderInitialized(providerName))
  51. {
  52. m_authenticationProvidersMap[providerName]->PasswordGrantMultiFactorSignInAsync(username, password);
  53. }
  54. }
  55. void AuthenticationProviderManager::PasswordGrantMultiFactorConfirmSignInAsync(const ProviderNameEnum& providerName, const AZStd::string& username, const AZStd::string& confirmationCode)
  56. {
  57. if (IsProviderInitialized(providerName))
  58. {
  59. m_authenticationProvidersMap[providerName]->PasswordGrantMultiFactorConfirmSignInAsync(username, confirmationCode);
  60. }
  61. }
  62. void AuthenticationProviderManager::DeviceCodeGrantSignInAsync(const ProviderNameEnum& providerName)
  63. {
  64. if (IsProviderInitialized(providerName))
  65. {
  66. m_authenticationProvidersMap[providerName]->DeviceCodeGrantSignInAsync();
  67. }
  68. }
  69. void AuthenticationProviderManager::DeviceCodeGrantConfirmSignInAsync(const ProviderNameEnum& providerName)
  70. {
  71. if (IsProviderInitialized(providerName))
  72. {
  73. m_authenticationProvidersMap[providerName]->DeviceCodeGrantConfirmSignInAsync();
  74. }
  75. }
  76. void AuthenticationProviderManager::RefreshTokensAsync(const ProviderNameEnum& providerName)
  77. {
  78. if (IsProviderInitialized(providerName))
  79. {
  80. m_authenticationProvidersMap[providerName]->RefreshTokensAsync();
  81. }
  82. }
  83. void AuthenticationProviderManager::GetTokensWithRefreshAsync(const ProviderNameEnum& providerName)
  84. {
  85. if (!IsProviderInitialized(providerName))
  86. {
  87. AuthenticationProviderNotificationBus::Broadcast(&AuthenticationProviderNotifications::OnRefreshTokensFail
  88. , "Provider is not initialized");
  89. return;
  90. }
  91. AuthenticationTokens tokens = m_authenticationProvidersMap[providerName]->GetAuthenticationTokens();
  92. if (tokens.AreTokensValid())
  93. {
  94. AuthenticationProviderNotificationBus::Broadcast(&AuthenticationProviderNotifications::OnRefreshTokensSuccess, tokens);
  95. }
  96. else
  97. {
  98. m_authenticationProvidersMap[providerName]->RefreshTokensAsync();
  99. }
  100. }
  101. bool AuthenticationProviderManager::IsSignedIn(const ProviderNameEnum& providerName)
  102. {
  103. if (IsProviderInitialized(providerName))
  104. {
  105. return m_authenticationProvidersMap[providerName]->GetAuthenticationTokens().AreTokensValid();
  106. }
  107. return false;
  108. }
  109. bool AuthenticationProviderManager::SignOut(const ProviderNameEnum& providerName)
  110. {
  111. if (IsProviderInitialized(providerName))
  112. {
  113. m_authenticationProvidersMap[providerName]->SignOut();
  114. AuthenticationProviderNotificationBus::Broadcast(&AuthenticationProviderNotifications::OnSignOut, providerName);
  115. return true;
  116. }
  117. return false;
  118. }
  119. AuthenticationTokens AuthenticationProviderManager::GetAuthenticationTokens(const ProviderNameEnum& providerName)
  120. {
  121. return m_authenticationProvidersMap[providerName]->GetAuthenticationTokens();
  122. }
  123. AZStd::unique_ptr<AuthenticationProviderInterface> AuthenticationProviderManager::CreateAuthenticationProviderObject(const ProviderNameEnum& providerName)
  124. {
  125. switch (providerName)
  126. {
  127. case ProviderNameEnum::AWSCognitoIDP:
  128. return AZStd::make_unique<AWSCognitoAuthenticationProvider>();
  129. case ProviderNameEnum::LoginWithAmazon:
  130. return AZStd::make_unique<LWAAuthenticationProvider>();
  131. case ProviderNameEnum::Google:
  132. return AZStd::make_unique<GoogleAuthenticationProvider>();
  133. default:
  134. return nullptr;
  135. }
  136. }
  137. bool AuthenticationProviderManager::IsProviderInitialized(const ProviderNameEnum& providerName)
  138. {
  139. bool ret = m_authenticationProvidersMap.contains(providerName);
  140. AZ_Assert(ret, "ProviderName enum %i not initialized. Please call initialize first");
  141. return ret;
  142. }
  143. void AuthenticationProviderManager::ResetProviders()
  144. {
  145. for (auto& [providerName, providerInterface] : m_authenticationProvidersMap)
  146. {
  147. providerInterface.reset();
  148. }
  149. }
  150. ProviderNameEnum AuthenticationProviderManager::GetProviderNameEnum(AZStd::string name)
  151. {
  152. auto enumValue = ProviderNameEnumNamespace::FromStringToProviderNameEnum(name);
  153. if (enumValue.has_value())
  154. {
  155. return enumValue.value();
  156. }
  157. AZ_Warning("AuthenticationProviderManager", false, "Incorrect string value for enum: %s", name.c_str());
  158. return ProviderNameEnum::None;
  159. }
  160. bool AuthenticationProviderManager::Initialize(
  161. const AZStd::vector<AZStd::string>& providerNames)
  162. {
  163. AZStd::vector<ProviderNameEnum> providerNamesEnum;
  164. for (auto name : providerNames)
  165. {
  166. providerNamesEnum.push_back(GetProviderNameEnum(name));
  167. }
  168. return Initialize(providerNamesEnum);
  169. }
  170. void AuthenticationProviderManager::PasswordGrantSingleFactorSignInAsync(const AZStd::string& providerName, const AZStd::string& username, const AZStd::string& password)
  171. {
  172. PasswordGrantSingleFactorSignInAsync(GetProviderNameEnum(providerName), username, password);
  173. }
  174. void AuthenticationProviderManager::PasswordGrantMultiFactorSignInAsync(const AZStd::string& providerName, const AZStd::string& username, const AZStd::string& password)
  175. {
  176. PasswordGrantMultiFactorSignInAsync(GetProviderNameEnum(providerName), username, password);
  177. }
  178. void AuthenticationProviderManager::PasswordGrantMultiFactorConfirmSignInAsync(const AZStd::string& providerName, const AZStd::string& username, const AZStd::string& confirmationCode)
  179. {
  180. PasswordGrantMultiFactorConfirmSignInAsync(GetProviderNameEnum(providerName), username, confirmationCode);
  181. }
  182. void AuthenticationProviderManager::DeviceCodeGrantSignInAsync(const AZStd::string& providerName)
  183. {
  184. DeviceCodeGrantSignInAsync(GetProviderNameEnum(providerName));
  185. }
  186. void AuthenticationProviderManager::DeviceCodeGrantConfirmSignInAsync(const AZStd::string& providerName)
  187. {
  188. DeviceCodeGrantConfirmSignInAsync(GetProviderNameEnum(providerName));
  189. }
  190. void AuthenticationProviderManager::RefreshTokensAsync(const AZStd::string& providerName)
  191. {
  192. RefreshTokensAsync(GetProviderNameEnum(providerName));
  193. }
  194. void AuthenticationProviderManager::GetTokensWithRefreshAsync(const AZStd::string& providerName)
  195. {
  196. GetTokensWithRefreshAsync(GetProviderNameEnum(providerName));
  197. }
  198. bool AuthenticationProviderManager::IsSignedIn(const AZStd::string& providerName)
  199. {
  200. return IsSignedIn(GetProviderNameEnum(providerName));
  201. }
  202. bool AuthenticationProviderManager::SignOut(const AZStd::string& providerName)
  203. {
  204. return SignOut(GetProviderNameEnum(providerName));
  205. }
  206. AuthenticationTokens AuthenticationProviderManager::GetAuthenticationTokens(const AZStd::string& providerName)
  207. {
  208. return GetAuthenticationTokens(GetProviderNameEnum(providerName));
  209. }
  210. } // namespace AWSClientAuth