---
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](<%=vars.serverman%>/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;
}
```
