githubEdit

πŸ”“Authentication

Going back to these snippets of the configuration file:

[...]
    auth:
      mode: HTTP
      customErrorCode: 499
      byCredentials:
        - user: myUser1
          password: myCoolPassword
        - user: myUser2
          hashedPassword: b133a0c0e9bee3be20163d2ad31d6248db292aa6dcb1ee087a2aa50e0fc75a[e2
 [...]
    auth:
      mode: INLINE
      byQuery: SELECT 1 FROM AUTH WHERE USER = :user AND PASSWORD = :password

The authnodes represent the structure that instructs ws4sqlite to protect that db with authentication.

circle-info

If a database is protected with auth and the client provides wrong credentials, or doesn't provide any, the HTTP answer will be 401 Unauthorised.

On the server

Authentication mode

Lines 3, 12; string; mandatory

The first, common parameter is mode, that indicates the means that the client is required to use to authenticate. It can be:

Custom error code

Line 4; number

If this parameter is not specified, an authentication error will return the standard 401 Not Authorized. Often a browser will react to this by displaying a standard authentication dialog; if this is not desired (because the auth has a custom implementation, for example) it may be needed to specify an alternative error code. The customErrorCode configuration allows to do exactly this.

Specifying the credentials

Lines 5-9, 13; object; mandatory

You can see that there are two methods to configure the resolution of the credentials on the server:

  • Provide a query that will be executed in the database, as in Line 13. The query SQL must contain two placeholders, :user and :password, that will be replaced by the server with the username and password provided by the client. If the query returns at least one result, the credentials are valid; if it returns 0 records, access will be denied.\

  • Provide a set of credentials in the config file itself, as in Lines 6-9. You can specify the password as plain text (ensure that the file is not world-readable...) or as SHA-256 hashes. See below to learn how to hash passwords.

The auth block is not mandatory. If provided, the database will be protected with it; if omitted, no authentication is requested. If you provide one, it will be ignored.

triangle-exclamation

Generating hashes

circle-exclamation

In order to generate hashes for the password, you can use an online service like thisarrow-up-right, but it's better not to trust anything online. In Linux or MacOS you can instead use this one-liner:

This will read a string from the stdin without echoing it, and outputs the hash to use.

Credentials in the request (INLINE mode)

When a database is protected with authentication in INLINE mode, the client needs to specify the credentials in the request itself. Simply include a node like this:

If the token verification fails, the response will be returned after 1 second, to prevent brute forcing. The wait time is per database: different failed requests for the same database will "stack", while different databases will work concurrently.

Last updated