---
title:  Authentication
---

<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

A client is authenticated when it connects with valid credentials to a <%=vars.product_name%> cache server that is configured with the client authentication callback.
For details on the server's role in authentication and what it expects from the client, see [Implementing Authentication](geodeman/managing/security/implementing_authentication.html) in the *<%=vars.product_name%> User Guide*.

In your application, authentication credentials must be set when creating the cache. In practice,
this means setting the authentication credentials when you create the CacheFactory.

### C++ Authentication Example

In this C++ authentication example, the `CacheFactory` creation process sets the authentication callback:

```cpp
  auto cache = CacheFactory()
      .set("log-level", "none")
      .setAuthInitialize(std::unique_ptr<ExampleAuthInitialize>(new ExampleAuthInitialize()))
      .create();
```

Credentials are implemented in the `getCredentials` member function of the `ExampleAuthInitialize`, which is derived from the `AuthInitialize` abstract class.

```cpp
std::shared_ptr<Properties> ExampleAuthInitialize::getCredentials(
    const std::shared_ptr<Properties>& securityprops,
    const std::string& /*server*/) {

  securityprops->insert("security-username", "root");
  securityprops->insert("security-password", "root");

  return securityprops;
}
```
