Add Basic Authentication to a Service or a Route with username and password protection. The plugin will check for valid credentials in the Proxy-Authorization
and Authorization
header (in this order).
Terminology
plugin
: a plugin executing actions inside IAM before or after a request has been proxied to the upstream API.Service
: the IAM entity representing an external upstream API or microservice.Route
: the IAM entity representing a way to map downstream requests to upstream services.upstream service
: this refers to your own API/service sitting behind IAM, to which client requests are forwarded.
Configuration
This plugin is compatible with requests with the following protocols:
http
https
This plugin is partially compatible with DB-less mode.
Consumers and Credentials can be created with declarative configuration. Admin API endpoints which do POST, PUT, PATCH or DELETE on Credentials are not available on DB-less mode.Enabling the plugin on a Service
With a database
Configure this plugin on a Service by making the following request:
$ curl -X POST http://localhost:8001/services/{service}/plugins \
--data "name=basic-auth" \
--data "config.hide_credentials=true"
Without a database
Configure this plugin on a Service by adding this section do your declarative configuration file:
plugins:
- name: basic-auth
service: {service}
config:
hide_credentials: true
In both cases, {service}
is the id
or name
of the Service that this plugin configuration will target.
Enabling the plugin on a Route
With a database
Configure this plugin on a Route with:
$ curl -X POST http://localhost:8001/routes/{route}/plugins \
--data "name=basic-auth" \
--data "config.hide_credentials=true"
Without a database
Configure this plugin on a Route by adding this section do your declarative configuration file:
plugins:
- name: basic-auth
route: {route}
config:
hide_credentials: true
In both cases, {route}
is the id
or name
of the Route that this plugin configuration will target.
Global plugins
- Using a database, all plugins can be configured using the
http://localhost:8001/plugins/
endpoint. - Without a database, all plugins can be configured via the
plugins:
entry on the declarative configuration file.
A plugin which is not associated to any Service, Route or Consumer (or API, if you are using an older version of IAM) is considered "global", and will be run on every request. Read the Plugin Reference and the Plugin Precedence sections for more information.
Parameters
Here's a list of all the parameters which can be used in this plugin's configuration:
form parameter | description |
---|---|
name | The name of the plugin to use, in this case basic-auth |
service_id | The id of the Service which this plugin will target. |
route_id | The id of the Route which this plugin will target. |
enabled default value: true | Whether this plugin will be applied. |
config.hide_credentials
optional default value:
|
An optional boolean value telling the plugin to show or hide the credential from the upstream service. If |
config.anonymous
optional |
An optional string (consumer uuid) value to use as an “anonymous” consumer if authentication fails. If empty (default), the request will fail with an authentication failure |
Once applied, any user with a valid credential can access the Service. To restrict usage to only some of the authenticated users, also add the ACL plugin (not covered here) and create whitelist or blacklist groups of users.
Usage
In order to use the plugin, you first need to create a Consumer to associate one or more credentials to. The Consumer represents a developer or an application consuming the upstream service.
Create a Consumer
You need to associate a credential to an existing Consumer object. A Consumer can have many credentials.
With a Database
To create a Consumer, you can execute the following request:
curl -d "username=user123&custom_id=SOME_CUSTOM_ID" http://localhost:8001/consumers/
Without a Database
Your declarative configuration file will need to have one or more Consumers. You can create them
on the consumers:
yaml section:
consumers:
- username: user123
custom_id: SOME_CUSTOM_ID
In both cases, the parameters are as described below:
parameter | description |
---|---|
username semi-optional |
The username of the consumer. Either this field or custom_id must be specified. |
custom_id semi-optional |
A custom identifier used to map the consumer to another database. Either this field or username must be specified. |
If you are also using the ACL plugin and whitelists with this service, you must add the new consumer to a whitelisted group. See ACL: Associating Consumers for details.
Create a Credential
With a Database
You can provision new username/password credentials by making the following HTTP request:
$ curl -X POST http://localhost:8001/consumers/{consumer}/basic-auth \
--data "username=Aladdin" \
--data "password=OpenSesame"
Without a Database
You can add credentials on your declarative config file on the basicauth_credentials
yaml entry:
basicauth_credentials:
- consumer: {consumer}
username: Aladdin
password: OpenSesame
In both cases, the fields / parameters work as described below:
field/parameter | description |
---|---|
{consumer} |
The id or username property of the Consumer entity to associate the credentials to. |
username |
The username to use in the Basic Authentication |
password optional |
The password to use in the Basic Authentication |
Using the Credential
The authorization header must be base64 encoded. For example, if the credential
uses Aladdin
as the username and OpenSesame
as the password, then the field's
value is the base64-encoding of Aladdin:OpenSesame
, or QWxhZGRpbjpPcGVuU2VzYW1l
.
Then the Authorization
(or Proxy-Authorization
) header must appear as:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
Simply make a request with the header:
$ curl http://localhost:8000/{path matching a configured Route} \
-H 'Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l'
Upstream Headers
When a client has been authenticated, the plugin will append some headers to the request before proxying it to the upstream service, so that you can identify the Consumer in your code:
X-Consumer-ID
, the ID of the Consumer on IAMX-Consumer-Custom-ID
, thecustom_id
of the Consumer (if set)X-Consumer-Username
, theusername
of the Consumer (if set)X-Credential-Username
, theusername
of the Credential (only if the consumer is not the ‘anonymous' consumer)X-Anonymous-Consumer
, will be set totrue
when authentication failed, and the ‘anonymous' consumer was set instead.
You can use this information on your side to implement additional logic. You can use the X-Consumer-ID
value to query the IAM Admin API and retrieve more information about the Consumer.
Paginate through the basic-auth Credentials
You can paginate through the basic-auth Credentials for all Consumers using the following request:
$ curl -X GET http://localhost:8001/basic-auths
{
"total": 3,
"data": [
{
"created_at": 1511379926000,
"id": "805520f6-842b-419f-8a12-d1de8a30b29f",
"password": "37b1af03d3860acf40bd9c681aa3ef3f543e49fe",
"username": "baz",
"consumer": { "id": "5e52251c-54b9-4c10-9605-b9b499aedb47" }
},
{
"created_at": 1511379863000,
"id": "8edfe5c7-3151-4d92-971f-3faa5e6c5d7e",
"password": "451b06c564a06ce60874d0ea2f542fa8ed26317e",
"username": "foo",
"consumer": { "id": "89a41fef-3b40-4bb0-b5af-33da57a7ffcf" }
},
{
"created_at": 1511379877000,
"id": "f11cb0ea-eacf-4a6b-baea-a0e0b519a990",
"password": "451b06c564a06ce60874d0ea2f542fa8ed26317e",
"username": "foobar",
"consumer": { "id": "89a41fef-3b40-4bb0-b5af-33da57a7ffcf" }
}
]
}
You can filter the list by consumer by using this other path:
$ curl -X GET http://localhost:8001/consumers/{username or id}/basic-auth
{
"total": 1,
"data": [
{
"created_at": 1511379863000,
"id": "8edfe5c7-3151-4d92-971f-3faa5e6c5d7e",
"password": "451b06c564a06ce60874d0ea2f542fa8ed26317e",
"username": "foo",
"consumer": { "id": "89a41fef-3b40-4bb0-b5af-33da57a7ffcf" }
}
]
}
username or id
: The username or id of the consumer whose credentials need to be listed
Retrieve the Consumer associated with a Credential
It is possible to retrieve a Consumer associated with a basic-auth Credential using the following request:
curl -X GET http://localhost:8001/basic-auths/{username or id}/consumer
{
"created_at":1507936639000,
"username":"foo",
"id":"c0d92ba9-8306-482a-b60d-0cfdd2f0e880"
}
username or id
: The id
or username
property of the basic-auth
Credential for which to get the associated Consumer.
Note that the username
accepted here is not the username
property of a
Consumer.