Introduction
Now we've learned the data fetching and manipulation essentials of Refine. In this unit, we'll learn how to add authentication to our application and the essentials of authentication in Refine.
Refine provides an easy to manage authentication interface that can be used with any authentication provider with minimal effort.
This unit will cover the following topics:
- Learning the
AuthProvider
interface by creating an authentication provider, - Usage of the auth hooks and components such as
useLogin
,useIsAuthenticated
hooks and<Authenticated />
component. - Handling authentication in data providers and managing authentication errors.
This unit will be router and UI framework agnostic. Related parts of authentication for the router and UI framework will be covered in the next units.
Was this helpful?
import { useTable, useMany } from "@refinedev/core"; export const ListProducts = () => { const { tableQuery: { data, isLoading }, current, setCurrent, pageCount, sorters, setSorters, } = useTable({ resource: "products", pagination: { current: 1, pageSize: 10 }, sorters: { initial: [{ field: "id", order: "asc" }] }, }); const { data: categories } = useMany({ resource: "categories", ids: data?.data?.map((product) => product.category?.id) ?? [], }); if (isLoading) { return <div>Loading...</div>; } const onPrevious = () => { if (current > 1) { setCurrent(current - 1); } }; const onNext = () => { if (current < pageCount) { setCurrent(current + 1); } }; const onPage = (page: number) => { setCurrent(page); }; const getSorter = (field: string) => { const sorter = sorters?.find((sorter) => sorter.field === field); if (sorter) { return sorter.order; } } const onSort = (field: string) => { const sorter = getSorter(field); setSorters( sorter === "desc" ? [] : [ { field, order: sorter === "asc" ? "desc" : "asc", }, ] ); } const indicator = { asc: "⬆️", desc: "⬇️" }; return ( <div> <h1>Products</h1> <table> <thead> <tr> <th onClick={() => onSort("id")}> ID {indicator[getSorter("id")]} </th> <th onClick={() => onSort("name")}> Name {indicator[getSorter("name")]} </th> <th> Category </th> <th onClick={() => onSort("material")}> Material {indicator[getSorter("material")]} </th> <th onClick={() => onSort("price")}> Price {indicator[getSorter("price")]} </th> </tr> </thead> <tbody> {data?.data?.map((product) => ( <tr key={product.id}> <td>{product.id}</td> <td>{product.name}</td> <td> { categories?.data?.find( (category) => category.id == product.category?.id, )?.title } </td> <td>{product.material}</td> <td>{product.price}</td> </tr> ))} </tbody> </table> <div className="pagination"> <button type="button" onClick={onPrevious}> {"<"} </button> <div> {current - 1 > 0 && <span onClick={() => onPage(current - 1)}>{current - 1}</span>} <span className="current">{current}</span> {current + 1 < pageCount && <span onClick={() => onPage(current + 1)}>{current + 1}</span>} </div> <button type="button" onClick={onNext}> {">"} </button> </div> </div> ); };
installing dependencies
installing dependencies