Client certificate (currently use the Certificate File option as the console is by default started in a user context instead of system context); Once connected successfully with a valid Azure AD Account or Client Certificate we can start the connection analyzer to verify the Cloud Management Gateway is working properly. Discover secure, future-ready cloud solutionson-premises, hybrid, multicloud, or at the edge. To create a Gateway instance, . Select your preferred version of Spring Boot and add the "Gateway" and "Eureka Discovery" dependencies, and generate as a Maven project: It is built on top of other Spring ecosystem projects, including Spring . Overall, which API Gateway to use will depend on your use case. Configure Gateway Instances. In our case, it will be a user login. You can specify relevant options through the configuration of spring.cloud.gateway.httpclient prefix. The spring cloud gateway acts as a gate keeper that accepts/rejects the requests from clients based on the criteria configured in the gateway. server.ssl.client-auth=need And this is pretty much it, you can go on and create your @RestControllerswith endpoints fully secured behind a x509 certificate. Spring Cloud Gateway provides a library for building API gateways on top of Spring and Java. Spring Cloud Gateway is the Reactive API Gateway of the Spring Ecosystem, built on Spring Boot, WebFlux, and Project Reactor. It provides a flexible way of routing requests based on a number of criteria, as well as focuses on cross-cutting concerns such as security, resiliency, and monitoring. Why Is It Important? Gateway routes can be routed to both http and https backends. Includes Kubernetes operator for handling API gateway custom resources applied to cluster and Kubernetes "native" experience. It consists of the following building blocks-. We will introduce the basic concepts behind gRPC and how to configure it with two examples: One that showcases how Spring Cloud Gateway can transparently re-route gRPC traffic without needing to know the proto definition and without having to . * configuration keys, but the defaults are fine if you ensure that your application has a value for spring.application.name . The instance behaviour is driven by eureka.instance. In my case I set eureka.instance.securePortEnabled=true in the target microservice only and in gateway I set lb:// , spring.cloud.gateway.httpclient.ssl.trusted-x509-certificates= cert.pem. Spring Cloud Gateway for Kubernetes instances can be deployed for each team (or LoB) and become their common integration endpoint. Spring Cloud Gateway 2020.0.0 Spring Cloud Gateway CORS"" CORSURLSpring FrameworkCorsConfiguration Spring Cloud Gateway for VMware Tanzu provides a simple yet effective way to route API requests (internal or external) to application services that expose APIs on Tanzu Application Service. This project provides a library that can be used to create your own API gateway implementation to route HTTP traffic to application services written in any programming language. pom.xml. Secure Spring boot Rest APIs with client certificate Goal This is part III of a series of articles on Spring security topic. We use Spring Cloud Gateway. The new self-signed certificates are not available inside Docker, causing the repository clone to fail. Spring Cloud Gateway provides an object to create the route mapping, RouteLocatorBuilder, which we will use to customize all back-end routing in our application. You need to first allocate Spring Cloud Gateway for Kubernetes docker images to the docker registry we installed in localhost at port 5000. Vault can manage static and dynamic secrets such as username/password for remote applications/resources and provide credentials for external services such . If you include the starter, but, for some reason, you do not want the gateway to be enabled, set spring.cloud.gateway.enabled . Once that directory is created, cd into it, and run the following commands to generate a sample project. Everything . To process this client request, I need to connect outbound to an external webservice that does require mutual authentication. 4.1 create gateway service First, create a new API gateway service. This filter takes an optional keyResolver parameter. It seem that the spring-cloud-gateway not forwarding the client certificate to the backend-service. The Spring Cloud Gateway uses routes in order to process requests to downstream services. Its job is to proxy and route requests to services and to provide cross-cutting concerns such as security, monitoring, and resilience. In this part, we will use X.509 certificate authentication. How to Include Spring Cloud Gateway 2. However, we will develop two microservices. A route is matched if the aggregate . For creating certificates stuff, please take a look on this tutorial Used technologies JDK 1.8 Maven 3.2 (Spring boot 2.x and Spring security 5.x) Maven It is an essential part when we adopt the microservices architecture. When this feature is enabled, the Gateway will serve a custom certificate to the requesting client. Client Certificate Authorization (mTLS) For security-conscience application topologies that require mutual authentication (mTLS), Spring Cloud Gateway needs to authorize incoming client certificates and also forward it to the application that is responding to the request. 8. Perhaps more importantly, the enterprise can still adhere to common API governance policies. These commands will automatically generate projects from Spring Initializr. That Gateway is also a OAuth2 Client, authentication on GitHub, over a authentication code mode. It consists of a network of three services: a Single Sign-On Server, an API Gateway Server, and a Resource Server. The product, based on the open source Spring Cloud Gateway project, is the API gateway solution that application developers love. Currently using spring boot/spring cloud gateway (Hoxton SR3), and I have a SCG path route listening on https (inbound not client auth, doesn't need to be). For this purpose we'll use openssl library, so we need to have it installed prior to following the next step. doc Part XV. The KeyResolver interface allows you to create pluggable strategies derive the key for limiting requests. Build your business case for the cloud with key financial and technical guidance from Azure. If it is fixed, you can also specify maxConnections and acquireTimeout parameters. GitHub spring-cloud / spring-cloud-gateway Public Notifications Star 3.3k Fork 2.5k Code Issues 233 Pull requests 24 Actions Projects Wiki Security Insights New issue 1. This project contains 3 micro services + Gateway using Spring Cloud Gateway + Netflix Eureka Server + Angular client Select Yes next to Assign endpoint to assign a public endpoint. Let's see another popular edge server called Spring Cloud Gateway, which is built on Spring Framework 5, Project Reactor and Spring Boot 2.0. Spring Cloud Gateway 1. I modified the Netty config and it is successfully requesting a client cert from the client, but I don't see it forwarding it to the microservice behind it. 3. As we will use Netflix Zuul as the API Gateway implementation, we first need to add the dependency of Netflix Zuul in the. I am trying to use spring-cloud-gateway for a spring-boot based service that uses ssl with client-auth. Running Vault. It consists of the following building blocks- Route: Route the basic building block of the gateway. jpd1 changed the title Using KeyVault Certificates and Secrets on Spring Cloud Gateway Using KeyVault Certificates and Secrets with Spring Cloud Gateway on Apr 30, 2021 joshfree added azure-spring azure-spring-keyvault Client labels on Apr 30, 2021 msftbot bot removed the needs-triage label on Apr 30, 2021 joshfree assigned stliu on Apr 30, 2021 It is mainly divided into three categories: pool, proxy and ssl. A request rate limiter feature needs to be enabled using the component called GatewayFilter. Spring Cloud Gateway makes use of the Actuator API, a well-known Spring Boot library that provides several out-of-the-box services for monitoring the application. We will create here configuration file - src/main/resources/application.yml file to configure routing. The project was built on the Spring Framework 5, which uses the Project Reactor as. The default type of pool is elastic. spring: cloud: gateway: httpclient: ssl: useInsecureTrustManager: true. You can use the code of this example directly or combine your own business code. Here we give it a client id "spring-gateway-client" and keep the client protocol as "OpenID-connect" and click save. Spring Cloud Gateway for Kubernetes includes the following key features: Polyglot supported routability for application services written in any language that wish expose HTTP endpoints on Gateway instances. 1 I am trying to forward client certificate information from Spring Cloud Gateway to microservices behind it. We will need to create multiple applications, so first, create a directory to contain everything related to this post and call it spring-cloud-gateway-websocket . This topic describes how to configure and update a Spring Cloud Gateway for Kubernetes instance. The important part in the gateway is the filter that performs the validation on the incoming requests and route the requests to the appropriate microservices. That's it now we are ready to test our application on browser using https://localhost:9001/ {urlEndpoint} . Configure Spring Cloud Gateway Rate Limiter key. Fixes spring-cloudgh-491. After configuring your Azure AD application, you can set up the SSO properties of Spring Cloud Gateway or API Portal following these steps: Select Spring Cloud Gateway or API portal under VMware Tanzu components in the left menu, then select Configuration. 3.1. TAS provides options for forwarding client certificates to applications . The problem is, calling the service from a client over the api-gateway always fails with "certificate_unknown" (works fine without the gateway). Generating a server CA certificate Let's see what has to be done on the server's side with regards to creating the certificate: openssl genrsa -aes256-outserverprivate.key 2048 Key Features. Open settings tab of chrome browser and open security tab. Global infrastructure. 4, Gateway quick start Use Spring Cloud Gateway to realize the simplest request routing. This way we'll act as our own certificate authority. Name Default Description; spring.cloud.azure.cosmos.client-telemetry-enabled. Spring Cloud Gateway Using an insecure trust manager is not suitable for production. Step1: Init a Spring Cloud Gateway. Feign . I have a Spring Boot Cloud Gateway application running on a k8s POD. Spring Cloud Gateway as an OAuth 2.0 Client In this scenario, any unauthenticated incoming request will initiate an authorization code flow. The code to add the Netflix Zuul dependency is: <dependency>. I have a case where frontend is sending JWT token with authorized user data and for each request Spring Cloud Gateway needs to create a x509 client certificate for that user and use that to call ba. If routing to a https backend then the Gateway can be configured to trust all downstream certificates with the following configuration: application.yml. This appendix provides a list of common Spring Cloud Gateway properties and references to the underlying classes that consume them. You'll get a URL in a few minutes. Spring Cloud Gateway is API Gateway implementation by Spring Cloud team on top of Spring reactive ecosystem. Property contributions can come from additional jar files on your classpath, so you should not consider this an exhaustive list. Route Predicate Factories 5.1. Shortcut Configuration 4.2. Route: Route the basic building block of the gateway. (cherry picked from commit 3f17c0d) * Fix gh 491 gh 553 non reactive loadbalancer client (spring-cloud#590) * Provide non-reactive LB client implemenation to use with RestTemplate. From the extracted folder, run the image relocation script that is located in the scripts directory. In this example, casdoor-gateway as the gateway service and casdoor-api as the business service. Now tap on "import" and select .p12 file and import it to browser. Spring Cloud Gateway features: Built on Spring Framework 5, Project Reactor and Spring Boot 2.0 Able to match routes on any request attribute. Having spring-cloud-starter-netflix-eureka-client on the classpath makes the app into both a Eureka "instance" (that is, it registers itself) and a "client" (it can query the registry to locate other services). You can also use CLI to do it, as shown in the following command: Spring Cloud Consul provides Consul integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. How It Works 4. This distributed API gateway approach promotes agility and high-performance operations. spring: cloud: gateway: httpclient: ssl: useInsecureTrustManager: true . In this demo, I will be showing how to use spring-cloud-starter-netflix-zuul library for Netflix API Gateway. Cloud economics. <groupId>org.springframework . If routing to a https backend then the Gateway can be configured to trust all downstream certificates with the following configuration: application.yml. Step2: Include the dependency Once the Actuator API is installed and configured, the gateway monitoring features can be visualized by accessing /gateway/ endpoint. . spring-cloud-starter-gateway spring-cloud-starter-netflix-eureka-client The end state of the dependencies file should look similar to the following pom.xml. Implementation Whether to enable client telemetry which will periodically collect database operations aggregation statistics, system information like cpu/memory and send it to cosmos monitoring service, which will be helpful during debugging. Spring Cloud Vault Config provides client-side support for externalized configuration in a distributed system. Setting up the gateway to route traffic to our WebSocket Server instances is pretty simple. With a few simple annotations you can quickly enable and configure the common patterns inside your application and build large distributed systems with Hashicorp's Consul. Spring Cloud Gateway supports two forms of routing: Java (using RouteLocator) and configuration files (application.properties/yaml). The diagram below shows the overall system design. We need a gateway service and at least one business service. That application have no page, no endpoint at all, just receive the traffic from Ingress and redirect for a Vue Web Application with just static pages on another POD. 2. This command pulls, tags, and pushes the images to the docker registry: Spring Cloud Gateway is mainly used in one of the following roles: OAuth Client OAuth Resource Server Let's discuss each of those cases in more detail. If you click a default Vault UI redirects to form responsible for certificate . Basically, the spring boot gateway provides a simple and effective way to route API's. The Resource Server is a regular Spring Boot application hidden behind the API Gateway. The After Route Predicate Factory 5.2. Feign Client . In the security tab go to bottom of the page and open "Manage Certificates" tab. It consists of an ID, destination URI Collection of predicates, and a collection of filters. Next, we will keep the "Standard Flow Enabled" option ON which allows us to use the OAuth2 mechanism. To include Spring Cloud Gateway in your project use the starter with group org.springframework.cloud and artifact id spring-cloud-starter-gateway.See the Spring Cloud Project page for details on setting up your build system with the current Spring Cloud Release Train.. Let's go to the Vault UI once again. Fully Expanded Arguments 5. Predicates and filters are specific to routes. 4.2 add gateway dependency and nacos dependency Note that the Gateway project must not introduce web starter dependency, because the Gateway itself is not based on Servlet implementation. Solution The certificates need to be added to the Java keystore inside the Docker. It's not secure to use spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true in the production. . Example of API Gateway with Spring Cloud. The API Gateway is built with Spring Cloud Gateway and delegates the management of user . Circuit Breaker integration. Let's now create the CA certificate: The API Gateway Service is a Spring Boot application that routes client requests to the Message service. * Fix after code review. To be able to sign our server-side and client-side certificates, we need to create our own self-signed root CA certificate first. Learn about sustainable, trusted cloud infrastructure with more regions than any other provider. Spring Cloud Gateway is API Gateway implementation by the Spring Cloud team on top of the Spring reactive ecosystem. Select the Spring Cloud Gateway section, then select Overview to view the running state and resources given to Spring Cloud Gateway and its operator. pom.xml file. We will use this client to communicate with Keycloak from our Spring Cloud Gateway application. We will use the following command for the same java -Dapp_port=8084 -jar .\target\spring-cloud-gateway-1..jar Once this is done, we have our Gateway ready to be tested on port 8084. Since it is built on top of Spring WebFlux, that example is perfectly right for our current article. Edit the application. If required, the Gateway can select from a set of certificates to respond with, based . Once again let's create a new project with Spring Initializr. Configuring Route Predicate Factories and Gateway Filter Factories 4.1. It will provide an easy way for routing requests based on number criteria; it will also focus on monitoring and security of an application. 7+ years of experience in design, development and implementation of software applications using Java, J2EE, Spring Boot, Spring Cloud API Gateway.Hands-on experience using Spring Framework in business layer for Dependency Injection, AOP, Spring MVC, transaction management and using Hibernate as a persistence layer.Extensive knowledge on the spring modules like Spring IOC, Spring Boot, Spring . * Add more information on working with spring-cloud-loadbalancer vs. spring-cloud-starter-netflix-ribbon to the docs. Now, let us compile and execute the Gateway project. The Spring Cloud Gateway enables us to have these features in a Spring-managed bean, in a Spring way using Dependency Injection and other features provided by the Spring Framework. Configure Routes in the Gateway. Spring cloud gateway provides a library for building gateway API on top of java and spring. Spring Cloud DiscoveryClient integration Easy to write Predicates and Filters Request Rate Limiting Path Rewriting Getting Started The Before Route Predicate Factory 5.3. Customer enablement With HashiCorp's Vault you have a central place to manage external secret properties for applications across all environments. FeignClient () Spring Cloud Feign Client REST . This may not match the actual client IP address if Spring Cloud Gateway sits behind a proxy layer. It consists of ID destination URI Collection of predicates and a collection of filters A route is matched if aggregate predicate is true. Glossary 3. Save the URL to use later. Spring Cloud Gateway for Kubernetes is based on the open source Spring Cloud Gateway project. Also, you can define your own properties. Before doing it we need to generate a client certificate with a private key. But the most of these gateways provide options to scale, flexibility and support. Enter the Scope, Client Id, Client Secret, and Issuer URI in the appropriate fields . Starting from version 3.1.0 as part of the Spring Cloud 2021.0.0 (aka Jubilee) release train, Spring Cloud Gateway included support for gRPC and HTTP/2. Step1: Init a Spring Cloud Gateway to Route traffic to our WebSocket Server instances is pretty simple for. That application developers love specify maxConnections and acquireTimeout parameters by accessing /gateway/ endpoint & gt ; is! An insecure trust manager is not suitable for production: application.yml is,. Before doing it we need to generate a sample project of filters casdoor-api as Gateway! Can still adhere to common API governance policies monitoring, and resilience ; dependency & gt ; an insecure manager! Stack Developer Resume GA - Hire spring cloud gateway client certificate People < /a > 3 Gateway project, the. Oauth2 client, authentication on GitHub, over a authentication code mode scripts. Common API governance policies microservices < /a > configure Routes in the security tab go to of. From a set of certificates to applications for spring.application.name as the API Gateway approach promotes agility high-performance. Needs to be enabled using the component called GatewayFilter you can also specify maxConnections and parameters! Still adhere to common API governance policies: Cloud: Gateway: httpclient: ssl: useInsecureTrustManager true We First need to be enabled, set spring.cloud.gateway.enabled request, I will be a user login create a API! Documentation < /a > key features Server, an API Gateway with an example - Knoldus Blogs < >. Trying to forward client certificate with a private key any unauthenticated incoming request will initiate an authorization flow! Will create here configuration file - src/main/resources/application.yml file to configure routing authentication code mode and select file! Id, destination URI Collection of predicates, and Issuer URI in the Gateway to Route traffic to WebSocket > 7 your business case for the Cloud with key financial and guidance Require mutual authentication WebSocket Server instances is pretty simple to manage external properties Vmware Spring Cloud Vault Config provides client-side support for externalized configuration in a distributed system can adhere. Gateway service First, create a new project with Spring Cloud Gateway project is A https backend then the Gateway all environments for production Gateway will a! Connect outbound to an external webservice that does require mutual authentication the key for limiting requests Spring! Ui once again example, casdoor-gateway as the Gateway will serve a custom certificate to the requesting client 5 which! Then the Gateway monitoring features can be visualized by accessing /gateway/ endpoint aggregate is. The open source Spring Cloud Gateway for Kubernetes Documentation < /a > configure Routes in the strategies. Is Spring Cloud Gateway as an OAuth 2.0 client in this scenario, any unauthenticated request. //Cloud.Spring.Io/Spring-Cloud-Static/Spring-Cloud-Gateway/2.2.0.Rc2/Reference/Html/ '' > Full Stack Developer Resume GA - Hire it People < /a > Spring Gateway. Resource Server is a regular Spring Boot application hidden behind the API Gateway is also a OAuth2 client authentication! That does require mutual authentication application has a value for spring.application.name a Collection of predicates, and Collection Properties for applications across all environments WebSocket Server instances is pretty simple Assign public. The dependency of Netflix Zuul dependency is: & lt ; dependency & gt ; | VMware Developer Based on the Spring Framework 5, which uses the project Reactor as application! Of routing: Java ( using RouteLocator ) and configuration files ( ) Useinsecuretrustmanager: true //microsoft.github.io/spring-cloud-azure/current/reference/html/appendix.html '' > how to build Spring Cloud Gateway enterprise can still adhere to common governance! Trust all downstream certificates with the following configuration: application.yml user login on browser using https: ''! Or combine your own business code: Cloud: Gateway: httpclient ssl! ; tab if routing to a https backend then the Gateway you click a default Vault UI once.! > 7 with Keycloak from our Spring Cloud Gateway as an OAuth 2.0 client in this scenario any Perfectly right for our current article key features specify maxConnections and acquireTimeout parameters an example - Knoldus Blogs /a Was built on top of other Spring ecosystem projects, including Spring # x27 ; ll a. Requesting client business code built with Spring Initializr > we will use X.509 certificate authentication and provide. Including Spring, based over a authentication code mode Server, and Issuer URI in the provide! Provide options to scale, flexibility and support example - Knoldus Blogs /a! Api governance policies Filter Factories 4.1 to an external webservice that does require mutual authentication configuration (! Vault Config provides client-side support for externalized configuration in a few minutes: Init a Spring Cloud Gateway microservices. Application has a value for spring.application.name to proxy and Route requests to services and to provide cross-cutting concerns as X.509 certificate authentication Keycloak from our Spring Cloud Gateway supports two forms of routing: Java ( using RouteLocator and! Right for our current article mainly divided into three categories: pool, proxy and Route to! Technical guidance from Azure Init a Spring Cloud Gateway value for spring.application.name filters a Route is matched if aggregate is This part, we will use X.509 certificate authentication for Kubernetes Documentation < /a > Step1: a., flexibility and support Gateway service and at least one business service specify Connect outbound to an external webservice that does require mutual authentication commands will generate! For forwarding client certificates to respond with, based we & # ; Let & # x27 ; s not secure to use spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true in the scripts directory requests to services to Our Spring Cloud Gateway to Route traffic to our WebSocket Server instances is pretty. On browser using https: //microsoft.github.io/spring-cloud-azure/current/reference/html/appendix.html '' > VMware Spring Cloud Gateway as OAuth! Let & # x27 ; s it now we are ready to test our application browser. In this demo, I need to be enabled, set spring.cloud.gateway.enabled set spring.cloud.gateway.enabled the following configuration:.! Am trying to forward client certificate with spring cloud gateway client certificate private key certificates to with. An exhaustive list '' > Spring Cloud Gateway supports two forms of routing: Java ( RouteLocator A URL in a distributed system //localhost:9001/ { urlEndpoint }: //localhost:9001/ { urlEndpoint } > Step1: Init Spring! Github Pages < /a > configure Routes in the Gateway can be configured to trust downstream! A Collection of filters a Route is matched if aggregate Predicate is true use! Casdoor-Gateway as the business service the Gateway monitoring features can be configured to trust all downstream certificates with the configuration! Uses the project was built on the open source Spring Cloud Gateway for microservices /a Sign-On Server, an API Gateway approach promotes agility and high-performance operations application has a value for spring.application.name will here. Fixed, you do not want the Gateway service First, create new! And provide credentials for external services such provide cross-cutting concerns such as security, monitoring and! Also a OAuth2 client, authentication on GitHub, over a authentication code mode to connect outbound to an webservice. All downstream certificates with the following building blocks- Route: Route the basic building block of the Gateway be! Distributed API Gateway client, authentication on GitHub, over a authentication code mode let & # ;. Code flow certificate information from Spring Initializr following commands to generate a sample.! Page and open & quot ; manage certificates & quot ; tab provider. And to provide cross-cutting concerns such as security, monitoring, and a Collection of filters guidance! Pluggable strategies derive the key for limiting requests need a Gateway service First, a This scenario, any unauthenticated incoming request will initiate an authorization code flow interface allows you to create strategies. A new project with Spring Initializr and ssl the production combine your own business code in a few. Not consider this an exhaustive list way we & # x27 ; s secure. A few minutes enterprise can still adhere to common API governance policies a Use X.509 certificate authentication example, casdoor-gateway as the API Gateway custom resources applied to cluster and Kubernetes & ; File and import it to browser /a > Step1: Init a Spring Cloud Gateway Route! Init spring cloud gateway client certificate Spring Cloud Gateway for microservices < /a > Step1: a. Use spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true in the appropriate fields fine if you include the starter, but, for some reason you! Credentials for external services such and Issuer URI in the also a OAuth2 client, on! Fixed, you can use the code to add the Netflix Zuul the. To configure routing across all environments Netflix Zuul as the business service to manage secret Will create here configuration file - src/main/resources/application.yml file to configure routing it will be a user. Or combine your own business code Predicate Factories and Gateway Filter Factories 4.1 Vault Certificate authority ; tab: httpclient: ssl: useInsecureTrustManager: true can manage static and dynamic secrets such username/password Extracted folder, run the following configuration: application.yml regions than any other provider 4.1 create Gateway service at! Now tap on & quot ; manage certificates & quot ; experience spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true in appropriate. ; s go to the requesting client //cloud.spring.io/spring-cloud-gateway/multi/multi__tls_ssl.html '' > mutual ssl authentication proxying to downstream service on top Spring! First need to be enabled using the component called GatewayFilter secure to use spring-cloud-starter-netflix-zuul library for Netflix API Gateway that To microservices behind it RouteLocator ) and configuration files ( application.properties/yaml ) own certificate authority contributions can from Management of user the page and open & quot ; and select.p12 file and import it browser! //Cloud.Spring.Io/Spring-Cloud-Gateway/Multi/Multi__Tls_Ssl.Html '' > Full Stack Developer Resume GA - Hire it People < /a Spring. Starter, but, for some reason, you can use the code add. And configured, the Gateway service First, create a new API Gateway with an -! Ecosystem projects, including Spring an exhaustive list you ensure that your application has a value spring.application.name Manage certificates & quot ; tab so you should not consider this an exhaustive list, an Gateway