Login & Authentication
In OpenTera, login and authentication are 2 separate concepts.
Authentication refers to the process of having sufficient credentials to access the
REST API. Multiple authentication schemes are supported (see below)
Login refers to the process of calling the appropriate login API, gets the current token for the authentication and, optionally, opens a websocket connection to receive messages and events.
Authentication
Supported authentication depends on the API level that is accessed.
User API
HTTP Basic Auth
Using username and password authentication, the requester can be identified and allowed (or not) to access that API. Since basic auth is implemented, it is quite important to always use SSL to encrypt communications for security purpose when deploying to a server. Otherwise, login credentials may be at risk since they would be sent over an unencrypted connection.
Token Bearer
Using the HTTP Authorization
header in a request, it is possible to use a token for authentication
after having obtained a valid token.
In the
Authorization
request header of the HTTP request, the<type>
value must be set toOpenTera
and the<credentials>
must contain a valid token.User token can be obtained with a call to the
login
API (see below). Currently, users can’t log only using a token. To get the initial token, an HTTP Basic Auth scheme must be used (see above).User tokens are set to expire after 1 hour, and a new token can be obtained before expiration by calling the
refreshtoken
API.
Participant API
HTTP Basic Auth
Using username and password authentication, the requester can be identified and allowed (or not) to access that API. Since basic auth is implemented, it is quite important to always use SSL to encrypt communications for security purpose when deploying to a server.
For participants, that authentication scheme is optional. If no username and password are defined or if the
participant_login_enabled
is set tofalse
for a specific participant (see database objects, this scheme will not work.
Token Bearer
Using the HTTP Authorization
header in a request, it is possible to use a token for authentication
instead of the standard username-password authentication. Each participant can also have a static access token.
In the
Authorization
request header of the HTTP request, the<type>
value must be set toOpenTera
and the<credentials>
must contain a valid token.A permanent login token can be used to obtain a valid dynamic token for further queries. This allows a participant to login without having a username-password scheme with some restrictions (see below). The static (permanent) token for a participant is automatically generated if
participant_token_enabled
is set in theTeraParticipant
database object model for that participant.If the initial
login
API call is done with the static token of a participant instead of a standard username-password scheme, the available API calls are quite limited (or will return less information).In the case where the initial
login
scheme is done with the participant static token, a dynamic token is not generated and thus can’t be used for further calls.In the API functions, the
role
parameter is used to check the access level. If the required role is set tofull
, a dynamic token will be required and the static token will not work. If the required role is set tolimited
, the static token will work to access that API function. For example,@participant_multi_auth.login_required(role='limited')
will allow the decorated function to be called with a static token.
Participants dynamic token can be obtained with a call to the
login
API (see below) with a username-password scheme.Participants tokens are set to expire after 1 hour, and a new token can be obtained before expiration by calling the
refreshtoken
API.
Device API
Token Bearer
Using the HTTP Authorization
header in a request, it is possible to use a token for authentication
for devices.
In the
Authorization
request header of the HTTP request, the<type>
value must be set toOpenTera
and the<credentials>
must contain a valid token.A device token is static (permanent): the device will use the same token for every request. It must be stored somewhere safe on the device. See
TeraDevice
Only an enabled device (
device_enabled
in theTeraDevice
database object) will be able to authenticate.
Token request argument
Instead of using the HTTP Authorization
header, it is also possible to append the token to a request by using the
token
argument.
Certificates
A device can also be authenticated using certificates.
The device must send a certificate signing request (standard x509 CSR) to the server using the
device/register
API.The server will reply with a signed certificate.
The device should store this certificate in a safe place (such as in a keystore) and use the certificate in each request made to the server.
Service API
Token Bearer
Using the HTTP Authorization
header in a request, it is possible to use a token for authentication for services:
In the
Authorization
request header of the HTTP request, the<type>
value must be set toOpenTera
and the<credentials>
must contain a valid token.A service token is static (permanent): the service will use the same token for every request. See
TeraService
Only an enabled service (
service_enabled
in theTeraService
database object) will be able to authenticate.
Inter communication message is provided to access the service information (including its token). A wrapper and base class is also available in the OpenTera PyPi package
Token request argument
Instead of using the HTTP Authorization
header, it is also possible to append the token to a request by using the
token
argument.
Login
Even if the replies can vary a little depending on the API level being accessed, the login process is similar in each case. The login process is needed to get the websocket (if requested), basic information about the logged on object and to get a dynamic token, if required, depending on the API level (see above).
Depending on the authentication scheme and the application, the login process might be optional. Without logging in, as long as the authentication scheme is respected, all API calls can proceed.
Important note: A user, participant or device will not come online in regards to the User Manager Module unless a websocket connection is established. This is by design and by the fact that the REST API, by definition, is a stateless and asynchronous system, and thus OpenTera doesn’t have any way to know if a user, participant or device is still there at the other end.
The login process can be summarized as:
Make a request with the correct authentication scheme to the
login
APIIf the object type is enabled (see database objects) and if the login credentials are valid, a return value containing at least the
_name
, the_uuid
and thewebsocket_url
will be returned. See the REST API for the specific return values for each of the specificlogin
functionsOptionally, and if the
with_websocket
parameter is set in the request, the client may connect to thewebsocket_url
. There is a 60 seconds window to establish the connection, otherwise it will be denied. That url can only be used once: once a client is connected, it will not be available for further websocket connections.
Logout
While recommended, a call to the logout
is optional.
When logging out, clean-up and dynamic token disabling will occur. If a websocket connection has been established, it will close automatically.