• Stars
    star
    440
  • Rank 99,050 (Top 2 %)
  • Language
    PHP
  • License
    MIT License
  • Created almost 11 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

PSR-7 and PSR-15 HTTP Basic Authentication Middleware

PSR-7 and PSR-15 Basic Auth Middleware

This middleware implements HTTP Basic Authentication. It was originally developed for Slim but can be used with all frameworks using PSR-7 or PSR-15 style middlewares. It has been tested with Slim Framework and Zend Expressive.

Latest Version Packagist Software License Build Status Coverage

Heads up! You are reading documentation for 3.x branch which is PHP 7.1 and up only. If you are using older version of PHP see the 2.x branch. These two branches are not backwards compatible, see UPGRADING for instructions how to upgrade.

Install

Install latest version using composer.

$ composer require tuupola/slim-basic-auth

Usage

Configuration options are passed as an array. Only mandatory parameter is users. This is an array where you pass one or more "username" => "password" combinations. Username is the key and password is the value.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ]
]));

Same with Zend Expressive.

$app = Zend\Expressive\AppFactory::create();

$app->pipe(new Tuupola\Middleware\HttpBasicAuthentication([
    "users" => [
        "root" => "t00r",
        "user" => "passw0rd"
    ]
]));

Rest of the examples assume you are using Slim Framework.

Cleartext passwords are only good for quick testing. You probably want to use hashed passwords. Hashed password can be generated with htpasswd command line tool or password_hash() PHP function

$ htpasswd -nbBC 10 root t00r
root:$2y$10$1lwCIlqktFZwEBIppL4ak.I1AHxjoKy9stLnbedwVMrt92aGz82.O
$ htpasswd -nbBC 10 somebody passw0rd
somebody:$2y$10$6/vGXuMUoRlJUeDN.bUWduge4GhQbgPkm6pfyGxwgEWT0vEkHKBUW
$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "users" => [
        "root" => '$2y$10$1lwCIlqktFZwEBIppL4ak.I1AHxjoKy9stLnbedwVMrt92aGz82.O',
        "somebody" => '$2y$10$6/vGXuMUoRlJUeDN.bUWduge4GhQbgPkm6pfyGxwgEWT0vEkHKBUW'
    ]
]));

Even if you are using hashed passwords it is not the best idea to store credentials in the code. Instead you could store them in environment or external file which is not committed to GitHub.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "users" => [
        "admin" => getenv("ADMIN_PASSWORD")
    ]
]));

Optional parameters

Path

The optional path parameter allows you to specify the protected part of your website. It can be either a string or an array. You do not need to specify each URL. Instead think of path setting as a folder. In the example below everything starting with /api will be authenticated.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => "/api", /* or ["/admin", "/api"] */
    "realm" => "Protected",
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ]
]));

Ignore

With optional ignore parameter you can make exceptions to path parameter. In the example below everything starting with /api and /admin will be authenticated with the exception of /api/token and /admin/ping which will not be authenticated.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => ["/api", "/admin"],
    "ignore" => ["/api/token", "/admin/ping"],
    "realm" => "Protected",
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ]
]));

Before

Before function is called only when authentication succeeds but before the next incoming middleware is called. You can use this to alter the request before passing it to the next incoming middleware in the stack. If it returns anything else than \Psr\Http\Message\RequestInterface the return value will be ignored.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => "/admin",
    "realm" => "Protected",
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ],
    "before" => function ($request, $arguments) {
        return $request->withAttribute("user", $arguments["user"]);
    }
]));

After

After function is called only when authentication succeeds and after the incoming middleware stack has been called. You can use this to alter the response before passing it next outgoing middleware in the stack. If it returns anything else than \Psr\Http\Message\ResponseInterface the return value will be ignored.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => "/admin",
    "realm" => "Protected",
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ],
    "after" => function ($response, $arguments) {
        return $response->withHeader("X-Brawndo", "plants crave");
    }
]));

Security

Basic authentication transmits credentials in clear text. For this reason HTTPS should always be used together with basic authentication. If the middleware detects insecure usage over HTTP it will throw a RuntimeException with the following message: Insecure use of middleware over HTTP denied by configuration.

By default, localhost is allowed to use HTTP. The security behavior of HttpBasicAuthentication can also be configured to allow:

How to configure a whitelist:

You can list hosts to allow access insecurely. For example, to allow HTTP traffic to your development host dev.example.com, add the hostname to the relaxed config key.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => "/admin",
    "secure" => true,
    "relaxed" => ["localhost", "dev.example.com"],
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ]
]));

Allow HTTPS termination and forwarding

If public traffic terminates SSL on a load balancer or proxy and forwards to the application host insecurely, HttpBasicAuthentication can inspect request headers to ensure that the original client request was initiated securely. To enable, add the string headers to the relaxed config key.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => "/admin",
    "secure" => true,
    "relaxed" => ["localhost", "headers"],
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ]
]));

Allow all unencrypted traffic

To allow insecure usage by any host, you must enable it manually by setting secure to false. This is generally a bad idea. Use only if you know what you are doing.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => "/admin",
    "secure" => false,
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ]
]));

Custom authentication methods

Sometimes passing users in an array is not enough. To authenticate against custom datasource you can pass a callable as authenticator parameter. This can be either a class which implements AuthenticatorInterface or anonymous function. Callable receives an array containing user and password as argument. In both cases authenticator must return either true or false.

If you are creating an Enterpriseâ„¢ software which randomly lets people log in you could use the following.

use Tuupola\Middleware\HttpBasicAuthentication\AuthenticatorInterface;
use Tuupola\Middleware\HttpBasicAuthentication;

class RandomAuthenticator implements AuthenticatorInterface {
    public function __invoke(array $arguments): bool {
        return (bool)rand(0,1);
    }
}

$app = new Slim\App;

$app->add(new HttpBasicAuthentication([
    "path" => "/admin",
    "realm" => "Protected",
    "authenticator" => new RandomAuthenticator
]));

Same thing can also be accomplished with anonymous function.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => "/admin",
    "realm" => "Protected",
    "authenticator" => function ($arguments) {
        return (bool)rand(0,1);
    }
]));

Setting response body when authentication fails

By default plugin returns an empty response body with 401 response. You can return custom body using by providing an error handler. This is useful for example when you need additional information why authentication failed.

$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => "/api",
    "realm" => "Protected",
    "users" => [
        "root" => "t00r",
        "somebody" => "passw0rd"
    ],
    "error" => function ($response, $arguments) {
        $data = [];
        $data["status"] = "error";
        $data["message"] = $arguments["message"];

        $body = $response->getBody();
        $body->write(json_encode($data, JSON_UNESCAPED_SLASHES));

        return $response->withBody($body);
    }
]));

Usage with PDO

For those in hurry there is a ready made PDO authenticator. It covers most of the use cases. You probably end up implementing your own though.

use Tuupola\Middleware\HttpBasicAuthentication\PdoAuthenticator;

$pdo = new PDO("sqlite:/tmp/users.sqlite");
$app = new Slim\App;

$app->add(new Tuupola\Middleware\HttpBasicAuthentication([
    "path" => "/admin",
    "realm" => "Protected",
    "authenticator" => new PdoAuthenticator([
        "pdo" => $pdo
    ])
]));

For better explanation see Basic Authentication from Database blog post.

Usage with FastCGI

By default Apache does not pass credentials to FastCGI process. If you are using mod_fcgi you can configure authorization headers with:

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization

Testing

You can run tests either manually or automatically on every code change. Automatic tests require entr to work.

$ make test
$ brew install entr
$ make watch

Contributing

Please see CONTRIBUTING for details.

Security

If you discover any security related issues, please email [email protected] instead of using the issue tracker.

License

The MIT License (MIT). Please see LICENSE for more information.

More Repositories

1

lazyload

Vanilla JavaScript plugin for lazyloading images
JavaScript
8,761
star
2

slim-jwt-auth

PSR-7 and PSR-15 JWT Authentication Middleware
PHP
828
star
3

jquery_chained

Chained Selects for jQuery and Zepto
JavaScript
589
star
4

slim-api-skeleton

Slim 3 API skeleton project for Composer
PHP
312
star
5

hagl

Hardware Agnostic Graphics Library for embedded
C
309
star
6

jquery_viewport

Add viewport selectors to jQuery. For example $("img:below-the-fold").something()
HTML
256
star
7

branca-spec

Authenticated and encrypted API tokens using modern crypto
223
star
8

server-timing-middleware

PSR-7 & PSR-15 middleware to add the Server-Timing header
PHP
198
star
9

base62

Base62 encoder and decoder for arbitrary data
PHP
195
star
10

micropython-mpu9250

MicroPython I2C driver for MPU9250 9-axis motion tracking device
Python
146
star
11

cors-middleware

PSR-7 and PSR-15 CORS middleware
PHP
132
star
12

ksuid

K-Sortable Globally Unique IDs for PHP
PHP
103
star
13

branca-js

Authenticated encrypted API Tokens for JavaScript.
JavaScript
94
star
14

php_google_maps

API to help working with Google Static Maps.
PHP
84
star
15

micropython-m5stack

MicroPython Kitchen Sink for M5Stack
Python
81
star
16

avr_demo

Atmel demo code. Does not use any Arduino libraries. I want to learn this the hard way (tm).
Makefile
80
star
17

slim-image-resize

Image Resize Middleware for Slim Framework
PHP
60
star
18

branca-php

Authenticated and encrypted API tokens using modern crypto
PHP
52
star
19

base58

Base58 encoder and decoder for arbitrary data
PHP
51
star
20

esp_video

Proof of concept video player for ESP32 boards
C
48
star
21

hagl_esp_mipi

ESP32 MIPI DCS abstraction layer for the HAGL graphics library
C
48
star
22

pybranca

Authenticated Encrypted API Tokens for Python.
Python
47
star
23

instrument

PHP application instrumentation toolkit
PHP
44
star
24

hagl_pico_mipi

Raspberry Pi Pico MIPI DCS absraction layer for the HAGL graphics library
C
44
star
25

esp_effects

Old school demo effects for ESP32
C
42
star
26

whereami

Common PHP interface for wifi positioning services
PHP
34
star
27

slim-facebook

Boilerplate Facebook application with Slim, Eloquent and Facebook API.
JavaScript
33
star
28

demo_code

Miscallenous demo code.
JavaScript
32
star
29

axp192

Platform agnostic I2C driver for AXP192 power system management IC
C
31
star
30

esp_examples

The mandatory ESP-IDF (ESP32) examples repository
C
30
star
31

jquery_filestyle

jQuery plugin for styling file input elements.
JavaScript
28
star
32

base85

Base85 encoder and decoder for arbitrary data
PHP
27
star
33

jquery_dictionary

Spotlight searchable offline jQuery API documentation for OS X.
25
star
34

trilateration

Trilateration for PHP
PHP
24
star
35

pico_effects

Old school demo effects for Raspberry Pi Pico
C
23
star
36

pcf8563

Platform agnostic I2C driver for PCF8563 RTC
C
22
star
37

esp_software_i2c

Software I2C driver for ESP-IDF (ESP32)
C
22
star
38

witchcraft

Opionated PHP magic methods as traits for PHP 5.4+
PHP
21
star
39

micropython-mpu6886

MicroPython I2C driver for MPU6886 6-axis motion tracking device
Python
20
star
40

micropython-ili934x

MicroPython SPI Driver for ILI934X Series Based TFT / LCD Displays
Python
18
star
41

http-factory

Lightweight autodiscovering PSR-17 HTTP factories
PHP
17
star
42

wolf_assets

Mephisto style assets management for Wolf CMS. This plugin is currently unmaintained. Let me know if you want to take over.
PHP
17
star
43

php-docker-k8s

Examples how to run PHP with Docker and Kubernetes
PHP
16
star
44

flat-ui-theme

Flat UI theme for TextMate 2 and Sublime Text
15
star
45

sdl2_effects

Old school demo effects with HAGL and SDL2
C
14
star
46

embedded-fonts

FONTX fonts for embedded projects
C
14
star
47

base32

Base32 encoder and decoder for arbitrary data
PHP
13
star
48

instrument-middleware

PSR-7 Middleware for instrumenting PHP applications
PHP
11
star
49

slim-todo-backend

Slim 3 + Spot example for todobackend.com
PHP
11
star
50

slim-skeleton

Slim 3 + Datamapper + Monolog + Plates project for Composer
PHP
11
star
51

callable-handler

Compatibility layer between PSR-7 double pass and PSR-15 middlewares
PHP
10
star
52

bm8563

Platform agnostic I2C driver for BM8563 RTC
C
9
star
53

hagl_sdl2

SDL2 abstraction layer for the HAGL graphics library
C
9
star
54

branca-middleware

PSR-7 and PSR-15 Branca token authentication middleware
PHP
9
star
55

micropython-examples

The mandatory various experiments with MicroPython repository
Python
9
star
56

micropython-lis2hh12

MicroPython I2C driver for LIS2HH12 3-axis accelerometer
Python
9
star
57

wolf_dashboard

Provides simple admin dashboard to Wolf CMS.
PHP
9
star
58

branca-elixir

Secure alternative to JWT. Authenticated encrypted API tokens for Elixir.
Elixir
8
star
59

frog_jquery

Add jQuery to Frog CMS admin interface.
PHP
8
star
60

jquery_jeditable_wysiwyg

Wysiwyg input for Jeditable.
JavaScript
8
star
61

wolf_funky_cache

Funky cache plugin for Wolf CMS
PHP
7
star
62

beeper

Generic paginator for PHP 7.1+
PHP
7
star
63

jquery_jeditable_markitup

Universal markup editor for Jeditable.
7
star
64

axp173

Platform agnostic I2C driver for AXP173 power system management IC
C
6
star
65

triple-a

Alternative AVR (Arduino) Library
C
6
star
66

esp_gfx

HAGL speed tests for ESP32 boards
C
6
star
67

axp202

Platform agnostic I2C driver for AXP202 PMU
C
6
star
68

wolf_first_child

Redirect to first child page behaviour for Wolf CMS.
PHP
6
star
69

php_record

Simple Active Record implementation in PHP.
PHP
6
star
70

esp_twatch2020

Kitchen sink project for T-Watch 2020 and ESP-IDF
C
6
star
71

micropython-gnssl76l

MicroPython I2C driver for Quectel GNSS L76-L (GPS)
Python
6
star
72

rack-facebook-method-fix

Rack middleware to fix Facebook always POST problem.
Ruby
6
star
73

rack-funky-cache

Funky caching for Rack based applications
Ruby
5
star
74

frog_email_template

Provides form mailer backend to Frog CMS. This code is no longer maintained. Please go to: https://github.com/dajare/wolf_email_template
PHP
5
star
75

mephisto_sitemap

Mephisto plugin which implements (Google, MSN, Yahoo ) Sitemap protocol.
Ruby
5
star
76

trytes

Trytes encoder and decoder for arbitrary data
PHP
4
star
77

wolf_jquery_ui

Add jQuery UI to Wolf CMS admin interface.
PHP
4
star
78

em-websocket-server

Simple websocket server with EventMachine
Ruby
4
star
79

esp_i2c_helper

ESP I2C master HAL for hardware agnostic I2C drivers
C
4
star
80

screenshot

Full size website screenshots with Sinatra.
JavaScript
4
star
81

pico_gfx

HAGL speed tests for Rasrpberry Pi Pico boards
C
4
star
82

hagl_esp_solomon

ESP32 Solomon HAL for the HAGL graphics library
C
4
star
83

esp_mipi

Low level MIPI DCS compatible display driver for ESP-IDF
C
4
star
84

hagl_gd

GD HAL for the HAGL graphics library
C
3
star
85

fontx_tools

C
3
star
86

gd32v_effects

Old school demo effects for GD32V
C
3
star
87

slim-fake-mcrypt

Fake PHP mcrypt extension to enable installing Slim 2.3.* with Composer
3
star
88

dbal-psr3-logger

PSR-3 Logger for Doctrine DBAL
PHP
3
star
89

ulid

Universally Unique Lexicographically Sortable Identifier
PHP
3
star
90

corelocation

PHP implementation of Apple location services protocol
PHP
3
star
91

rack-lazy-load

Companion Rack middleware for Lazy Load jQuery plugin.
Ruby
2
star
92

hagl_gd32v_mipi

GD32V MIPI DCS HAL for the HAGL graphics library
C
2
star
93

esp_m5stick

Kitchen sink project for M5StickC and ESP-IDF
C
2
star
94

appelsiini.net

Sources and build files for my personal blog.
HTML
2
star
95

madgwick-backup

Backup of Sebastian Madgwick's original LGPL licensed sensor fusion algorithm
C
2
star
96

branca-cli

Command line tool for encoding, decoding and inspecting Branca tokens
JavaScript
2
star
97

wolf_jquery_tools

Add jQuery Tools to Wolf CMS admin interface.
PHP
2
star
98

arduino_xylophone

Awesome christmas xylophone done with Arduino and Sinatra.
JavaScript
1
star
99

messente

An object-oriented Ruby wrapper for the Messente API.
Ruby
1
star
100

gd32v_gfx

HAGL speed tests for GD32V boards
C
1
star