Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# "ipAddress": "", # ipv4
# "dateTime": "2020-05-13T18:32:07.601Z"
# }
# }
return await self.client.http.account_generate_device_auth(
self.ios_account_id
)
async def delete_device_auth(self, device_id: str) -> None:
await self.client.http.account_delete_device_auth(
self.ios_account_id,
device_id
)
class EmailAndPasswordAuth(Auth):
"""Authenticates by email and password.
.. warning::
Some users might experience an error saying captcha was invalid.
If this is the case, use :class:`AdvancedAuth` with an exchange code
to generate a device auth.
Parameters
----------
email: :class:`str`
The accounts email.
password: :class:`str`
The accounts password.
two_factor_code: Optional[:class:`int`]
The current two factor code if needed. If not passed here, it
code = await self.get_exchange_code()
data = await self.exchange_code_for_session(
self.launcher_token,
code
)
self._update_launcher_data(data)
code = await self.get_exchange_code()
data = await self.exchange_code_for_session(
self.fortnite_token,
code
)
self._update_data(data)
class AdvancedAuth(Auth):
"""Authenticates by the available data in the following order:
1. By :class:`DeviceAuth` if ``device_id``, ``account_id`` and ``secret``
are present.
2. By :class:`EmailAndPasswordAuth` if ``email`` and ``password`` is
present. If authentication fails because of required captcha, it then
attempts to authenticate with the next step.
3. :class:`ExchangeCodeAuth` is tried if ``exchange_code`` is present
or if ``prompt_exchange_code`` is ``True``.
4. :class:`AuthorizationCodeAuth` is tried if ``authorization_code`` is
present or if ``prompt_authorization_code`` is ``True``.
If the authentication was not done by step 1, a device auth is
automatically generated and the details will be dispatched to
:func:`event_device_auth_generate`. It is important to store
these values somewhere since they can be used for easier logins.
data=payload
)
except HTTPException as e:
m = 'errors.com.epicgames.account.oauth.authorization_code_not_found' # noqa
if e.message_code == m:
raise AuthException(
'Invalid authorization code supplied',
e
) from e
raise
return data
class DeviceAuth(Auth):
"""Authenticate with device auth details.
.. note::
All device auths generated for an account is removed once the accounts
password gets reset. If you managed to leak you device_id and secret,
simply reset the accounts password and everything should be fine.
Parameters
----------
device_id: :class:`str`
The device id.
account_id: :class:`str`
The account's id.
secret: :class:`str`
The secret.
code = await self.get_exchange_code()
data = await self.exchange_code_for_session(
self.launcher_token,
code
)
self._update_launcher_data(data)
code = await self.get_exchange_code()
data = await self.exchange_code_for_session(
self.fortnite_token,
code
)
self._update_data(data)
class ExchangeCodeAuth(Auth):
"""Authenticates by an exchange code.
.. note::
The method to get an exchange code has been significantly harder
since epic patched the old method of copying the code from one of
their own endpoints that could be requested easily in a browser.
To obtain an exchange code it is recommended to provide a custom
solution like running a selenium process where you log in on
https://epicgames.com and then redirect to /id/api/exchange/generate.
You can then return the exchange code. You can put this solution
in a function and then pass this to ``exchange_code``.
.. note::
An exchange code only works for a single login within a short
)
self._update_launcher_data(data)
code = await self.get_exchange_code()
data = await self.exchange_code_for_session(
self.fortnite_token,
code
)
self._update_data(data)
async def reauthenticate(self) -> None:
"""Used for reauthenticating if refreshing fails."""
return await self.authenticate()
class RefreshTokenAuth(Auth):
"""Authenticates by the passed launcher refresh token.
Parameters
----------
refresh_token: :class:`str`
A valid launcher refresh token.
"""
def __init__(self, refresh_token: str,
**kwargs: Any) -> None:
super().__init__(**kwargs)
self._refresh_token = refresh_token
@property
def identifier(self) -> str:
return self._refresh_token