mirror of https://github.com/home-assistant/core
41 lines
1.5 KiB
Python
41 lines
1.5 KiB
Python
"""API for xbox bound to Home Assistant OAuth."""
|
|
|
|
from aiohttp import ClientSession
|
|
from xbox.webapi.authentication.manager import AuthenticationManager
|
|
from xbox.webapi.authentication.models import OAuth2TokenResponse
|
|
|
|
from homeassistant.helpers import config_entry_oauth2_flow
|
|
from homeassistant.util.dt import utc_from_timestamp
|
|
|
|
|
|
class AsyncConfigEntryAuth(AuthenticationManager):
|
|
"""Provide xbox authentication tied to an OAuth2 based config entry."""
|
|
|
|
def __init__(
|
|
self,
|
|
websession: ClientSession,
|
|
oauth_session: config_entry_oauth2_flow.OAuth2Session,
|
|
) -> None:
|
|
"""Initialize xbox auth."""
|
|
# Leaving out client credentials as they are handled by Home Assistant
|
|
super().__init__(websession, "", "", "")
|
|
self._oauth_session = oauth_session
|
|
self.oauth = self._get_oauth_token()
|
|
|
|
async def refresh_tokens(self) -> None:
|
|
"""Return a valid access token."""
|
|
if not self._oauth_session.valid_token:
|
|
await self._oauth_session.async_ensure_token_valid()
|
|
self.oauth = self._get_oauth_token()
|
|
|
|
# This will skip the OAuth refresh and only refresh User and XSTS tokens
|
|
await super().refresh_tokens()
|
|
|
|
def _get_oauth_token(self) -> OAuth2TokenResponse:
|
|
tokens = {**self._oauth_session.token}
|
|
issued = tokens["expires_at"] - tokens["expires_in"]
|
|
del tokens["expires_at"]
|
|
token_response = OAuth2TokenResponse.parse_obj(tokens)
|
|
token_response.issued = utc_from_timestamp(issued)
|
|
return token_response
|