Authentication¶
Frontend API¶
If you didn't do it previously, you have to generate private keys for the Frontend API.
php phing frontend-generate-new-keys
Authentication mechanism¶
Authentication is performed via @urql/auth-exchange.
Proper options for authExchange can be obtained with getAuthExchangeOptions
from urql/authExchange.ts
and it can be used for server-side rendering and client-side requests.
The following options are created for authExchange
:
addAuthToOperation
Responsible for adding access token as Authorization: Bearer xxx
header to each request made with URQL.
The authorization header is not added when no authState
exists (no previously authenticated user) or when the RefreshTokens
mutation is performed.
When the RefreshToken
mutation is performed, the access token can be already invalid, and FE API blocks every request with an invalid access token.
didAuthError
Check whether an error returned from the API is an authentication error (e.g. HTTP response status code is 401).
refreshAuth
This function parses the refresh token from the token cookie and tries to refresh the access token. It uses setTokensToCookies
to both refresh them and store them in a cookie. In the case of a successful refresh, tokens are immediately available for subsequent requests.
While the URQL is refreshing tokens, all other calls are paused. After a successful refresh, previously forbidden requests are re-executed with the new access token.
For logging the user in/out, we can use the useAuth
hook.
/hooks/auth/useAuth.tsx
User login
const [[loginResult, login]] = useAuth();
login(email: string, password: string);
This function calls the API mutation with the provided email and password.
If everything is OK, the user is logged in.
accessToken
and refreshToken
are then stored in the cookie, and the Zustand state is updated with information that the user is logged in.
User logout
const [, [, logout]] = useAuth();
logout();
Zustand state is updated with information that the user is no longer authenticated, and tokens are deleted from the cookie.