From 20a95a44d7f28f72ca6ff5879165079d3faf396e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 10 May 2018 16:22:51 -0400 Subject: [PATCH] Add authentication docs --- docs/architecture_entities.md | 2 +- docs/auth_api.md | 88 ++++++++++++++++++ docs/auth_index.md | 40 ++++++++ docs/external_api_websocket.md | 12 ++- website/i18n/en.json | 4 + website/sidebars.json | 4 + .../en/architecture/entities_architecture.png | Bin 0 -> 34546 bytes .../en/architecture/entities_architecture.svg | 1 - website/static/img/en/auth/architecture.png | Bin 0 -> 10340 bytes website/static/img/en/auth/authorize_flow.png | Bin 0 -> 18210 bytes 10 files changed, 148 insertions(+), 3 deletions(-) create mode 100644 docs/auth_api.md create mode 100644 docs/auth_index.md create mode 100644 website/static/img/en/architecture/entities_architecture.png delete mode 100644 website/static/img/en/architecture/entities_architecture.svg create mode 100644 website/static/img/en/auth/architecture.png create mode 100644 website/static/img/en/auth/authorize_flow.png diff --git a/docs/architecture_entities.md b/docs/architecture_entities.md index 3cb66a8f..67b8ee3b 100644 --- a/docs/architecture_entities.md +++ b/docs/architecture_entities.md @@ -3,7 +3,7 @@ title: "Entity Architecture" sidebar_label: Entity --- -![Architecture overview of Hass.io](/img/en/architecture/entities_architecture.svg) +![Architecture overview of Hass.io](/img/en/architecture/entities_architecture.png) ## Configuration diff --git a/docs/auth_api.md b/docs/auth_api.md new file mode 100644 index 00000000..cc68b261 --- /dev/null +++ b/docs/auth_api.md @@ -0,0 +1,88 @@ +--- +title: "Authentication API" +sidebar_label: API +--- + +> This is experimental. It is not persisted and is not yet intended for production. + +This page will describe the steps required to fetch an access token for a user and how to refresh it. We follow the OAuth 2 specification. + +## Requirements + +A client needs to be created inside Home Assistant before a client can request users to authorize it or fetch a new access token. The only way currently to create a client is programmatically: + +```python +client = await hass.auth.async_create_client( + 'Example client', + redirect_uris=['http://www.example.com/hass_callback'], + no_secret=True, +) +print(client.id) +``` + +## Authorize + +[![Authorization flow sequence diagram](/img/en/auth/authorize_flow.png)](https://www.websequencediagrams.com/?lz=dGl0bGUgQXV0aG9yaXphdGlvbiBGbG93CgpVc2VyIC0-IENsaWVudDogTG9nIGludG8gSG9tZSBBc3Npc3RhbnQKABoGIC0-IFVzZXI6AEMJZSB1cmwgAD4JACgOOiBHbyB0bwAeBWFuZCBhAC0ICgBQDgB1DACBFw5jb2RlAHELAE4RZXQgdG9rZW5zIGZvcgAoBgBBGlQAJQUK&s=qsd) + + - The authorize url should contain `client_id`, `redirect_uri` and, if available, `client_secret` as query parameters. Example: `http://your-instance.com/auth/authorize?client_id=ABCDE&client_secret=QWERTY&redirect_uri=https%3A%2F%2Fexample.com%2Fhass_callback` + - The user will navigate to this link, log into Home Assistant and authorize the client. + - Once authorized, the user will be redirected back to the passed in redirect uri with the authorization code as part of the query parameters. Example: https://example.com/hass_callback?code=12345 + - This authorization code can be exchanged for tokens by sending it to the token endpoint (see next section). + - As specified in the OAuth 2 specification, it is possible to pass an optional state string to the authorize url using the `state` query parameter. This string will be added as query parameter to the redirect url. + +## Token + +The token endpoint returns tokens given valid grants. This grant is either an authorization code retrieved from the authorize endpoint or a refresh token. + +All interactions with this endpoint need to be HTTP POST requests to `http://your-instance.com/auth/token` with the request body encoded in `application/x-www-form-urlencoded`. + +### Authorization code + +Use the grant type `authorization_code` to retrieve the tokens after a user has successfully finished the authorize step. The request body is: + +``` +grant_type=authorization_code&code=12345 +``` + +The return response will be an access and refresh token: + +```json +{ + "access_token": "ABCDEFGH", + "expires_in": 1800, + "refresh_token": "IJKLMNOPQRST", + "token_type": "Bearer" +} +``` + +### Refresh token + +Use the grant type `refresh_token` to retrieve an access token using a refresh token. The request body is: + +``` +grant_type=refresh_token&refresh_token=QWERTY +``` + +The return response will be an access token: + +```json +{ + "access_token": "ABCDEFGH", + "expires_in": 1800, + "token_type": "Bearer" +} +``` + +## Making authenticated requests + +Once you have an access token, you can make authenticated requests to the Home Assistant APIs. + +For the websocket connection, pass the access token in the [authentication message](http://localhost:3000/docs/en/external_api_websocket.html#authentication-phase). + +For HTTP requests, pass the token type and access token as the authorization header: + +``` +Authorization: Bearer ABCDEFGH +``` + +If the access token is no longer valid, you will get a response with HTTP status code 401 unauthorized. This means that you will need to refresh the token. If the refresh token doesn't work, the tokens are no longer valid and the client should ask the user to authorize again. diff --git a/docs/auth_index.md b/docs/auth_index.md new file mode 100644 index 00000000..2fa94854 --- /dev/null +++ b/docs/auth_index.md @@ -0,0 +1,40 @@ +--- +title: "Authentication" +sidebar_label: Introduction +--- + +> This is an experimental and unfinished API introduced in Home Assistant 0.69 and later. This is not enabled by default, it's not persisted to disk and should not be used in production. + +Home Assistant has a built-in authentication system allowing different users to interact with Home Assistant. The authentication system consist of various parts. + +![Overview of how the different parts interact](/img/en/auth/architecture.png) + +## Authentication providers + +An authentication provider is used for users to authenticate themselves. It's up to the authentication provider to choose the method of authentication and the backend to use. By default we enable the built-in Home Assistant authentication provider which stores the users securely inside your configuration directory. + +The authentication providers that Home Assistant will use are specified inside `configuration.yaml`. It is possible to have multiple instances of the same authentication provider active. In that case, each will be identified by a unique identifier. Authentication providers of the same type will not share credentials. + +## Credentials + +Credentials store the authentication of a user with a specific authentication provider. It is produced when a user successfully authenticates. It will allow the system to find the user in our system. If the user does not exist, a new user will be created. This user will not be activated but will require approval by the owner. + +It is possible for a user to have multiple credentials linked to it. However, it can only have a single credential per specific authentication provider. + +## Users + +Each person is a user in the system. To log in as a specific user, authenticate with any of the authentication providers that are linked to this user. When a user logs in, it will get a refresh and an access token to make requests to Home Assistant. + +### Owner + +The first user to log in to Home Assistant will be marked as the owner. This user is able to manage users. + +## Clients + +Clients are applications that users use to access the Home Assistant API. Each client has a client identifier, a redirect uri and an optional client secret. The redirect uri is used to redirect the user after it has successfully authorized. + +## Access and refresh tokens + +The client will be provided with an authorization code when a user successfully authorizes with Home Assistant. This code can be used to retrieve an access and a refresh token. The access token will have a limited lifetime while refresh tokens will remain valid until a user deletes it. + +The access token is used to access the Home Assistant APIs. The refresh token is used to retrieve a new valid access token. \ No newline at end of file diff --git a/docs/external_api_websocket.md b/docs/external_api_websocket.md index 0ee35ebf..07901af6 100644 --- a/docs/external_api_websocket.md +++ b/docs/external_api_websocket.md @@ -76,7 +76,7 @@ If authentication is necessary, the server sends out `auth_required`. } ``` -This means that the next message from the client should be an auth message: +This means that the next message from the client should be an auth message. You can authorize with either an API password (legacy auth) or an access token. ```json { @@ -85,6 +85,16 @@ This means that the next message from the client should be an auth message: } ``` +or + +```json +{ + "type": "auth", + "access_token": "ABCDEFGH" +} +``` + + If the client supplies valid authentication, the authentication phase will complete by the server sending the `auth_ok` message: ```json diff --git a/website/i18n/en.json b/website/i18n/en.json index 922b00fe..06ecad04 100644 --- a/website/i18n/en.json +++ b/website/i18n/en.json @@ -16,6 +16,9 @@ "asyncio_categorizing_functions": "Categorizing Functions", "asyncio_index": "Asynchronous Programming", "asyncio_working_with_async": "Working with Async", + "auth_api": "Authentication API", + "API": "API", + "auth_index": "Authentication", "config_entries_config_flow_handler": "Config Flow Handlers", "config_entries_index": "Config Entries", "configuration_yaml_index": "Configuration.yaml", @@ -90,6 +93,7 @@ "Backend": "Backend", "Misc": "Misc", "Entities": "Entities", + "Authentication": "Authentication", "Configuration.yaml": "Configuration.yaml", "Config Entries": "Config Entries", "Data Entry Flow": "Data Entry Flow", diff --git a/website/sidebars.json b/website/sidebars.json index 64e28f16..e8cbad3f 100644 --- a/website/sidebars.json +++ b/website/sidebars.json @@ -13,6 +13,10 @@ "entity_switch", "entity_weather" ], + "Authentication": [ + "auth_index", + "auth_api" + ], "Configuration.yaml": [ "configuration_yaml_index" ], diff --git a/website/static/img/en/architecture/entities_architecture.png b/website/static/img/en/architecture/entities_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..68dac7802b1d3ef2839c19d6e4b7a59f789a3f5c GIT binary patch literal 34546 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 Op2AZlSm6^R-~S7Z*vY~G literal 0 HcmV?d00001 diff --git a/website/static/img/en/architecture/entities_architecture.svg b/website/static/img/en/architecture/entities_architecture.svg deleted file mode 100644 index bf82c5a0..00000000 --- a/website/static/img/en/architecture/entities_architecture.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/static/img/en/auth/architecture.png b/website/static/img/en/auth/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2febcfd73d6f755b9285e1db5804978e506608 GIT binary patch literal 10340 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 literal 0 HcmV?d00001 diff --git a/website/static/img/en/auth/authorize_flow.png b/website/static/img/en/auth/authorize_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd3fb2d6d9d3aa0ca412723568eead43c31b0c3 GIT binary patch literal 18210 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