mirror of
https://github.com/fastapi-users/fastapi-users.git
synced 2025-08-16 03:40:23 +08:00
1677 lines
65 KiB
HTML
1677 lines
65 KiB
HTML
|
|
|
|
|
|
<!doctype html>
|
|
<html lang="en" class="no-js">
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
|
|
<meta name="description" content="Ready-to-use and customizable users management for FastAPI">
|
|
|
|
|
|
|
|
<link rel="shortcut icon" href="../../favicon.png">
|
|
<meta name="generator" content="mkdocs-1.1.2, mkdocs-material-5.2.2">
|
|
|
|
|
|
|
|
<title>Flow - FastAPI Users</title>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../../assets/stylesheets/main.a2408e81.min.css">
|
|
|
|
<link rel="stylesheet" href="../../assets/stylesheets/palette.a46bcfb3.min.css">
|
|
|
|
|
|
|
|
|
|
<meta name="theme-color" content="#ef5350">
|
|
|
|
|
|
|
|
|
|
|
|
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback">
|
|
<style>body,input{font-family:"Roboto",-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono",SFMono-Regular,Consolas,Menlo,monospace}</style>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="red" data-md-color-accent="red">
|
|
|
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
|
<label class="md-overlay" for="__drawer"></label>
|
|
<div data-md-component="skip">
|
|
|
|
|
|
<a href="#flow" class="md-skip">
|
|
Skip to content
|
|
</a>
|
|
|
|
</div>
|
|
<div data-md-component="announce">
|
|
|
|
</div>
|
|
|
|
<header class="md-header" data-md-component="header">
|
|
<nav class="md-header-nav md-grid" aria-label="Header">
|
|
<a href="../.." title="FastAPI Users" class="md-header-nav__button md-logo" aria-label="FastAPI Users">
|
|
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.5 12A2.5 2.5 0 0019 9.5 2.5 2.5 0 0016.5 7 2.5 2.5 0 0014 9.5a2.5 2.5 0 002.5 2.5M9 11a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m7.5 3c-1.83 0-5.5.92-5.5 2.75V19h11v-2.25c0-1.83-3.67-2.75-5.5-2.75M9 13c-2.33 0-7 1.17-7 3.5V19h7v-2.25c0-.85.33-2.34 2.37-3.47C10.5 13.1 9.66 13 9 13z"/></svg>
|
|
|
|
</a>
|
|
<label class="md-header-nav__button md-icon" for="__drawer">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z"/></svg>
|
|
</label>
|
|
<div class="md-header-nav__title" data-md-component="header-title">
|
|
|
|
<div class="md-header-nav__ellipsis">
|
|
<span class="md-header-nav__topic md-ellipsis">
|
|
FastAPI Users
|
|
</span>
|
|
<span class="md-header-nav__topic md-ellipsis">
|
|
|
|
Flow
|
|
|
|
</span>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<label class="md-header-nav__button md-icon" for="__search">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
|
|
</label>
|
|
|
|
<div class="md-search" data-md-component="search" role="dialog">
|
|
<label class="md-search__overlay" for="__search"></label>
|
|
<div class="md-search__inner" role="search">
|
|
<form class="md-search__form" name="search">
|
|
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" data-md-state="active">
|
|
<label class="md-search__icon md-icon" for="__search">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0116 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 019.5 16 6.5 6.5 0 013 9.5 6.5 6.5 0 019.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z"/></svg>
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</label>
|
|
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" data-md-component="search-reset" tabindex="-1">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
|
|
</button>
|
|
</form>
|
|
<div class="md-search__output">
|
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
|
<div class="md-search-result" data-md-component="search-result">
|
|
<div class="md-search-result__meta">
|
|
Initializing search
|
|
</div>
|
|
<ol class="md-search-result__list"></ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="md-header-nav__source">
|
|
|
|
<a href="https://github.com/frankie567/fastapi-users" title="Go to repository" class="md-source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
frankie567/fastapi-users
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
</nav>
|
|
</header>
|
|
|
|
<div class="md-container" data-md-component="container">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<main class="md-main" data-md-component="main">
|
|
<div class="md-main__inner md-grid">
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
|
|
<label class="md-nav__title" for="__drawer">
|
|
<a href="../.." title="FastAPI Users" class="md-nav__button md-logo" aria-label="FastAPI Users">
|
|
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.5 12A2.5 2.5 0 0019 9.5 2.5 2.5 0 0016.5 7 2.5 2.5 0 0014 9.5a2.5 2.5 0 002.5 2.5M9 11a3 3 0 003-3 3 3 0 00-3-3 3 3 0 00-3 3 3 3 0 003 3m7.5 3c-1.83 0-5.5.92-5.5 2.75V19h11v-2.25c0-1.83-3.67-2.75-5.5-2.75M9 13c-2.33 0-7 1.17-7 3.5V19h7v-2.25c0-.85.33-2.34 2.37-3.47C10.5 13.1 9.66 13 9 13z"/></svg>
|
|
|
|
</a>
|
|
FastAPI Users
|
|
</label>
|
|
|
|
<div class="md-nav__source">
|
|
|
|
<a href="https://github.com/frankie567/fastapi-users" title="Go to repository" class="md-source">
|
|
<div class="md-source__icon md-icon">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M439.55 236.05L244 40.45a28.87 28.87 0 00-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 01-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 000 40.81l195.61 195.6a28.86 28.86 0 0040.8 0l194.69-194.69a28.86 28.86 0 000-40.81z"/></svg>
|
|
</div>
|
|
<div class="md-source__repository">
|
|
frankie567/fastapi-users
|
|
</div>
|
|
</a>
|
|
</div>
|
|
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../.." title="About" class="md-nav__link">
|
|
About
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../installation/" title="Installation" class="md-nav__link">
|
|
Installation
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
|
|
|
|
<label class="md-nav__link" for="nav-3">
|
|
Configuration
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
|
|
</span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Configuration" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-3">
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</span>
|
|
Configuration
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/model/" title="User model" class="md-nav__link">
|
|
User model
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-2" type="checkbox" id="nav-3-2">
|
|
|
|
<label class="md-nav__link" for="nav-3-2">
|
|
Databases
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
|
|
</span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Databases" data-md-level="2">
|
|
<label class="md-nav__title" for="nav-3-2">
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</span>
|
|
Databases
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/databases/sqlalchemy/" title="SQLAlchemy" class="md-nav__link">
|
|
SQLAlchemy
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/databases/mongodb/" title="MongoDB" class="md-nav__link">
|
|
MongoDB
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/databases/tortoise/" title="Tortoise ORM" class="md-nav__link">
|
|
Tortoise ORM
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-3" type="checkbox" id="nav-3-3">
|
|
|
|
<label class="md-nav__link" for="nav-3-3">
|
|
Authentication
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
|
|
</span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Authentication" data-md-level="2">
|
|
<label class="md-nav__title" for="nav-3-3">
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</span>
|
|
Authentication
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/authentication/" title="Introduction" class="md-nav__link">
|
|
Introduction
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/authentication/jwt/" title="JWT" class="md-nav__link">
|
|
JWT
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/authentication/cookie/" title="Cookie" class="md-nav__link">
|
|
Cookie
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-3-4" type="checkbox" id="nav-3-4">
|
|
|
|
<label class="md-nav__link" for="nav-3-4">
|
|
Routers
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
|
|
</span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Routers" data-md-level="2">
|
|
<label class="md-nav__title" for="nav-3-4">
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</span>
|
|
Routers
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/routers/" title="Introduction" class="md-nav__link">
|
|
Introduction
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/routers/auth/" title="Auth router" class="md-nav__link">
|
|
Auth router
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/routers/register/" title="Register routes" class="md-nav__link">
|
|
Register routes
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/routers/reset/" title="Reset password router" class="md-nav__link">
|
|
Reset password router
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/routers/users/" title="Users router" class="md-nav__link">
|
|
Users router
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/full_example/" title="Full example" class="md-nav__link">
|
|
Full example
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../configuration/oauth/" title="OAuth2" class="md-nav__link">
|
|
OAuth2
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4" checked>
|
|
|
|
<label class="md-nav__link" for="nav-4">
|
|
Usage
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
|
|
</span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Usage" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-4">
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</span>
|
|
Usage
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__link md-nav__link--active" for="__toc">
|
|
Flow
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 9h14V7H3v2m0 4h14v-2H3v2m0 4h14v-2H3v2m16 0h2v-2h-2v2m0-10v2h2V7h-2m0 6h2v-2h-2v2z"/></svg>
|
|
</span>
|
|
</label>
|
|
|
|
<a href="./" title="Flow" class="md-nav__link md-nav__link--active">
|
|
Flow
|
|
</a>
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#1-registration" class="md-nav__link">
|
|
1. Registration
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="1. Registration">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#2-login" class="md-nav__link">
|
|
2. Login
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="2. Login">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#jwt-backend" class="md-nav__link">
|
|
JWT backend
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="JWT backend">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_1" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_1" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#cookie-backend" class="md-nav__link">
|
|
Cookie backend
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Cookie backend">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_2" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_2" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#3-get-my-profile" class="md-nav__link">
|
|
3. Get my profile
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="3. Get my profile">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_3" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_3" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#4-update-my-profile" class="md-nav__link">
|
|
4. Update my profile
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="4. Update my profile">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_4" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_4" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#5-become-a-superuser" class="md-nav__link">
|
|
5. Become a superuser 🦸🏻♂️
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="5. Become a superuser 🦸🏻♂️">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#51-get-the-profile-of-any-user" class="md-nav__link">
|
|
5.1. Get the profile of any user
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="5.1. Get the profile of any user">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_5" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_5" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#51-update-any-user" class="md-nav__link">
|
|
5.1. Update any user
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="5.1. Update any user">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_6" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_6" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#52-delete-any-user" class="md-nav__link">
|
|
5.2. Delete any user
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="5.2. Delete any user">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_7" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_7" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#6-logout" class="md-nav__link">
|
|
6. Logout
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="6. Logout">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_8" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_8" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#conclusion" class="md-nav__link">
|
|
Conclusion
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../routes/" title="Routes" class="md-nav__link">
|
|
Routes
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../dependency-callables/" title="Dependency callables" class="md-nav__link">
|
|
Dependency callables
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-nav__toggle md-toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
|
|
|
|
<label class="md-nav__link" for="nav-5">
|
|
Migration
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.59 16.58L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.42z"/></svg>
|
|
</span>
|
|
</label>
|
|
<nav class="md-nav" aria-label="Migration" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-5">
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</span>
|
|
Migration
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../migration/08_to_10/" title="0.8.x ➡️ 1.0.x" class="md-nav__link">
|
|
0.8.x ➡️ 1.0.x
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="__toc">
|
|
<span class="md-nav__icon md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</span>
|
|
Table of contents
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#1-registration" class="md-nav__link">
|
|
1. Registration
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="1. Registration">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#2-login" class="md-nav__link">
|
|
2. Login
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="2. Login">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#jwt-backend" class="md-nav__link">
|
|
JWT backend
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="JWT backend">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_1" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_1" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#cookie-backend" class="md-nav__link">
|
|
Cookie backend
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Cookie backend">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_2" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_2" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#3-get-my-profile" class="md-nav__link">
|
|
3. Get my profile
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="3. Get my profile">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_3" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_3" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#4-update-my-profile" class="md-nav__link">
|
|
4. Update my profile
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="4. Update my profile">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_4" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_4" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#5-become-a-superuser" class="md-nav__link">
|
|
5. Become a superuser 🦸🏻♂️
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="5. Become a superuser 🦸🏻♂️">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#51-get-the-profile-of-any-user" class="md-nav__link">
|
|
5.1. Get the profile of any user
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="5.1. Get the profile of any user">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_5" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_5" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#51-update-any-user" class="md-nav__link">
|
|
5.1. Update any user
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="5.1. Update any user">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_6" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_6" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#52-delete-any-user" class="md-nav__link">
|
|
5.2. Delete any user
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="5.2. Delete any user">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_7" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_7" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#6-logout" class="md-nav__link">
|
|
6. Logout
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="6. Logout">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#request_8" class="md-nav__link">
|
|
Request
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#response_8" class="md-nav__link">
|
|
Response
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#conclusion" class="md-nav__link">
|
|
Conclusion
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="md-content">
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h1 id="flow">Flow<a class="headerlink" href="#flow" title="Permanent link">¶</a></h1>
|
|
<p>This page will present you a complete registration and authentication flow once you've setup <strong>FastAPI Users</strong>. Each example will be presented with a <code>cURL</code> and an <code>axios</code> example.</p>
|
|
<h2 id="1-registration">1. Registration<a class="headerlink" href="#1-registration" title="Permanent link">¶</a></h2>
|
|
<p>First step, of course, is to register as a user.</p>
|
|
<h3 id="request">Request<a class="headerlink" href="#request" title="Permanent link">¶</a></h3>
|
|
<div class="tabbed-set" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><label for="__tabbed_1_1">cURL</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code>curl <span class="se">\</span>
|
|
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
-X POST <span class="se">\</span>
|
|
-d <span class="s2">"{\"email\": \"king.arthur@camelot.bt\",\"password\": \"guinevere\"}"</span> <span class="se">\</span>
|
|
http://localhost:8000/auth/register
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
<input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><label for="__tabbed_1_2">axios</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">axios</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">'http://localhost:8000/auth/register'</span><span class="p">,</span> <span class="p">{</span>
|
|
<span class="nx">email</span><span class="o">:</span> <span class="s1">'king.arthur@camelot.bt'</span><span class="p">,</span>
|
|
<span class="nx">password</span><span class="o">:</span> <span class="s1">'guinevere'</span><span class="p">,</span>
|
|
<span class="p">})</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">))</span>
|
|
<span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<h3 id="response">Response<a class="headerlink" href="#response" title="Permanent link">¶</a></h3>
|
|
<p>You'll get a JSON response looking like this:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"4fd3477b-eccf-4ee3-8f7d-68ad72261476"</span><span class="p">,</span>
|
|
<span class="nt">"email"</span><span class="p">:</span> <span class="s2">"king.arthur@camelot.bt"</span><span class="p">,</span>
|
|
<span class="nt">"is_active"</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"is_superuser"</span><span class="p">:</span> <span class="kc">false</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
|
|
<div class="admonition info">
|
|
<p class="admonition-title">Info</p>
|
|
<p>Several things to bear in mind:</p>
|
|
<ul>
|
|
<li>If you have defined other required fields in your <code>User</code> model (like a first name or a birthdate), you'll have to provide them in the payload.</li>
|
|
<li>The user is active by default.</li>
|
|
<li>The user cannot set <code>is_active</code> or <code>is_superuser</code> itself at registration. Only a superuser can do it by PATCHing the user.</li>
|
|
</ul>
|
|
</div>
|
|
<h2 id="2-login">2. Login<a class="headerlink" href="#2-login" title="Permanent link">¶</a></h2>
|
|
<p>Now, you can login as this new user.</p>
|
|
<p>You can generate a <a href="../../configuration/routers/auth/">login route</a> for each <a href="../../configuration/authentication/">authentication backend</a>. Each backend will have a different response.</p>
|
|
<h3 id="jwt-backend">JWT backend<a class="headerlink" href="#jwt-backend" title="Permanent link">¶</a></h3>
|
|
<h4 id="request_1">Request<a class="headerlink" href="#request_1" title="Permanent link">¶</a></h4>
|
|
<div class="tabbed-set" data-tabs="2:2"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><label for="__tabbed_2_1">cURL</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code>curl <span class="se">\</span>
|
|
-H <span class="s2">"Content-Type: multipart/form-data"</span> <span class="se">\</span>
|
|
-X POST <span class="se">\</span>
|
|
-F <span class="s2">"username=king.arthur@camelot.bt"</span> <span class="se">\</span>
|
|
-F <span class="s2">"password=guinevere"</span> <span class="se">\</span>
|
|
http://localhost:8000/auth/jwt/login
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
<input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><label for="__tabbed_2_2">axios</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="kr">const</span> <span class="nx">formData</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FormData</span><span class="p">();</span>
|
|
<span class="nx">formData</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">'username'</span><span class="p">,</span> <span class="s1">'king.arthur@camelot.bt'</span><span class="p">);</span>
|
|
<span class="nx">formData</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">'password'</span><span class="p">,</span> <span class="s1">'guinevere'</span><span class="p">);</span>
|
|
<span class="nx">axios</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span>
|
|
<span class="s1">'http://localhost:8000/auth/jwt/login'</span><span class="p">,</span>
|
|
<span class="nx">formData</span><span class="p">,</span>
|
|
<span class="p">{</span>
|
|
<span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
|
|
<span class="s1">'Content-Type'</span><span class="o">:</span> <span class="s1">'multipart/form-data'</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">},</span>
|
|
<span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">))</span>
|
|
<span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="admonition warning">
|
|
<p class="admonition-title">Warning</p>
|
|
<p>Notice that we don't send it as a JSON payload here but with <strong>form data</strong> instead. Also, the email is provided by a field named <strong><code>username</code></strong>.</p>
|
|
</div>
|
|
<h4 id="response_1">Response<a class="headerlink" href="#response_1" title="Permanent link">¶</a></h4>
|
|
<p>You'll get a JSON response looking like this:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"access_token"</span><span class="p">:</span><span class="s2">"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiNGZkMzQ3N2ItZWNjZi00ZWUzLThmN2QtNjhhZDcyMjYxNDc2IiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTg3ODE4NDI5fQ.anO3JR8-WYCozZ4_2-PQ2Ov9O38RaLP2RAzQIiZhteM"</span><span class="p">,</span>
|
|
<span class="nt">"token_type"</span><span class="p">:</span> <span class="s2">"bearer"</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
|
|
<p>You can use this token to make authenticated requests as the user <code>king.arthur@camelot.bt</code>. We'll see how in the next section.</p>
|
|
<h3 id="cookie-backend">Cookie backend<a class="headerlink" href="#cookie-backend" title="Permanent link">¶</a></h3>
|
|
<h4 id="request_2">Request<a class="headerlink" href="#request_2" title="Permanent link">¶</a></h4>
|
|
<div class="tabbed-set" data-tabs="3:2"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio" /><label for="__tabbed_3_1">cURL</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code>curl <span class="se">\</span>
|
|
-v <span class="se">\</span>
|
|
-H <span class="s2">"Content-Type: multipart/form-data"</span> <span class="se">\</span>
|
|
-X POST <span class="se">\</span>
|
|
-F <span class="s2">"username=king.arthur@camelot.bt"</span> <span class="se">\</span>
|
|
-F <span class="s2">"password=guinevere"</span> <span class="se">\</span>
|
|
http://localhost:8000/auth/cookie/login
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
<input id="__tabbed_3_2" name="__tabbed_3" type="radio" /><label for="__tabbed_3_2">axios</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="kr">const</span> <span class="nx">formData</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FormData</span><span class="p">();</span>
|
|
<span class="nx">formData</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">'username'</span><span class="p">,</span> <span class="s1">'king.arthur@camelot.bt'</span><span class="p">);</span>
|
|
<span class="nx">formData</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">'password'</span><span class="p">,</span> <span class="s1">'guinevere'</span><span class="p">);</span>
|
|
<span class="nx">axios</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span>
|
|
<span class="s1">'http://localhost:8000/auth/cookie/login'</span><span class="p">,</span>
|
|
<span class="nx">formData</span><span class="p">,</span>
|
|
<span class="p">{</span>
|
|
<span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
|
|
<span class="s1">'Content-Type'</span><span class="o">:</span> <span class="s1">'multipart/form-data'</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">},</span>
|
|
<span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">))</span>
|
|
<span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="admonition warning">
|
|
<p class="admonition-title">Warning</p>
|
|
<p>Notice that we don't send it as a JSON payload here but with <strong>form data</strong> instead. Also, the email is provided by a field named <strong><code>username</code></strong>.</p>
|
|
</div>
|
|
<h4 id="response_2">Response<a class="headerlink" href="#response_2" title="Permanent link">¶</a></h4>
|
|
<p>You'll get a empty response. However, the response will come with a <code>Set-Cookie</code> header (that's why we added the <code>-v</code> option in <code>cURL</code> to see them).</p>
|
|
<div class="highlight"><pre><span></span><code>set-cookie: fastapiusersauth=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiYzYwNjBmMTEtNTM0OS00YTI0LThiNGEtYTJhODc1ZGM1Mzk1IiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTg3ODE4OTQ3fQ.qNA4oPVYhoqrJIk-zvAyEfEVoEnP156G30H_SWEU0sU; HttpOnly; Max-Age=3600; Path=/; Secure
|
|
</code></pre></div>
|
|
|
|
<p>You can make authenticated requests as the user <code>king.arthur@camelot.bt</code> by setting a <code>Cookie</code> header with this cookie.</p>
|
|
<div class="admonition tip">
|
|
<p class="admonition-title">Tip</p>
|
|
<p>The cookie backend is more suited for browsers, as they handle them automatically. This means that if you make a login request in the browser, it will automatically store the cookie and automatically send it in subsequent requests.</p>
|
|
</div>
|
|
<h2 id="3-get-my-profile">3. Get my profile<a class="headerlink" href="#3-get-my-profile" title="Permanent link">¶</a></h2>
|
|
<p>Now that we can authenticate, we can get our own profile data. Depending on your <a href="../../configuration/authentication/">authentication backend</a>, the method to authenticate the request will vary. We'll stick with JWT from now on.</p>
|
|
<h3 id="request_3">Request<a class="headerlink" href="#request_3" title="Permanent link">¶</a></h3>
|
|
<div class="tabbed-set" data-tabs="4:2"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio" /><label for="__tabbed_4_1">cURL</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="nb">export</span> <span class="nv">TOKEN</span><span class="o">=</span><span class="s2">"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiNGZkMzQ3N2ItZWNjZi00ZWUzLThmN2QtNjhhZDcyMjYxNDc2IiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTg3ODE4NDI5fQ.anO3JR8-WYCozZ4_2-PQ2Ov9O38RaLP2RAzQIiZhteM"</span><span class="p">;</span>
|
|
curl <span class="se">\</span>
|
|
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
-H <span class="s2">"Authorization: Bearer </span><span class="nv">$TOKEN</span><span class="s2">"</span> <span class="se">\</span>
|
|
-X GET <span class="se">\</span>
|
|
http://localhost:8000/users/me
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
<input id="__tabbed_4_2" name="__tabbed_4" type="radio" /><label for="__tabbed_4_2">axios</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="kr">const</span> <span class="nx">TOKEN</span> <span class="o">=</span> <span class="s1">'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiNGZkMzQ3N2ItZWNjZi00ZWUzLThmN2QtNjhhZDcyMjYxNDc2IiwiYXVkIjoiZmFzdGFwaS11c2VyczphdXRoIiwiZXhwIjoxNTg3ODE4NDI5fQ.anO3JR8-WYCozZ4_2-PQ2Ov9O38RaLP2RAzQIiZhteM'</span><span class="p">;</span>
|
|
<span class="nx">axios</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span>
|
|
<span class="s1">'http://localhost:8000/users/me'</span><span class="p">,</span> <span class="p">{</span>
|
|
<span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
|
|
<span class="s1">'Authorization'</span><span class="o">:</span> <span class="sb">`Bearer </span><span class="si">${</span><span class="nx">TOKEN</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">})</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">))</span>
|
|
<span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<h3 id="response_3">Response<a class="headerlink" href="#response_3" title="Permanent link">¶</a></h3>
|
|
<p>You'll get a JSON response looking like this:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"4fd3477b-eccf-4ee3-8f7d-68ad72261476"</span><span class="p">,</span>
|
|
<span class="nt">"email"</span><span class="p">:</span> <span class="s2">"king.arthur@camelot.bt"</span><span class="p">,</span>
|
|
<span class="nt">"is_active"</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"is_superuser"</span><span class="p">:</span> <span class="kc">false</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
|
|
<div class="admonition tip">
|
|
<p class="admonition-title">Tip</p>
|
|
<p>If you use one of the <a href="../dependency-callables/">dependency callable</a> to protect one of your own endpoint, you'll have to authenticate exactly in the same way.</p>
|
|
</div>
|
|
<h2 id="4-update-my-profile">4. Update my profile<a class="headerlink" href="#4-update-my-profile" title="Permanent link">¶</a></h2>
|
|
<p>We can also update our own profile. For example, we can change our password like this.</p>
|
|
<h3 id="request_4">Request<a class="headerlink" href="#request_4" title="Permanent link">¶</a></h3>
|
|
<div class="tabbed-set" data-tabs="5:2"><input checked="checked" id="__tabbed_5_1" name="__tabbed_5" type="radio" /><label for="__tabbed_5_1">cURL</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code>curl <span class="se">\</span>
|
|
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
-H <span class="s2">"Authorization: Bearer </span><span class="nv">$TOKEN</span><span class="s2">"</span> <span class="se">\</span>
|
|
-X PATCH <span class="se">\</span>
|
|
-d <span class="s2">"{\"password\": \"lancelot\"}"</span> <span class="se">\</span>
|
|
http://localhost:8000/users/me
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
<input id="__tabbed_5_2" name="__tabbed_5" type="radio" /><label for="__tabbed_5_2">axios</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">axios</span><span class="p">.</span><span class="nx">patch</span><span class="p">(</span>
|
|
<span class="s1">'http://localhost:8000/users/me'</span><span class="p">,</span>
|
|
<span class="p">{</span>
|
|
<span class="nx">password</span><span class="o">:</span> <span class="s1">'lancelot'</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">{</span>
|
|
<span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
|
|
<span class="s1">'Authorization'</span><span class="o">:</span> <span class="sb">`Bearer </span><span class="si">${</span><span class="nx">TOKEN</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">},</span>
|
|
<span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">))</span>
|
|
<span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<h3 id="response_4">Response<a class="headerlink" href="#response_4" title="Permanent link">¶</a></h3>
|
|
<p>You'll get a JSON response looking like this:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"4fd3477b-eccf-4ee3-8f7d-68ad72261476"</span><span class="p">,</span>
|
|
<span class="nt">"email"</span><span class="p">:</span> <span class="s2">"king.arthur@camelot.bt"</span><span class="p">,</span>
|
|
<span class="nt">"is_active"</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"is_superuser"</span><span class="p">:</span> <span class="kc">false</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
|
|
<div class="admonition info">
|
|
<p class="admonition-title">Info</p>
|
|
<p>Once again, the user cannot set <code>is_active</code> or <code>is_superuser</code> itself. Only a superuser can do it by PATCHing the user.</p>
|
|
</div>
|
|
<h2 id="5-become-a-superuser">5. Become a superuser 🦸🏻♂️<a class="headerlink" href="#5-become-a-superuser" title="Permanent link">¶</a></h2>
|
|
<p>If you want to manage the users of your application, you'll have to become a <strong>superuser</strong>.</p>
|
|
<p>The very first superuser can only be set at <strong>database level</strong>: open it through a CLI or a GUI, find your user and set the <code>is_superuser</code> column/property to <code>true</code>.</p>
|
|
<h3 id="51-get-the-profile-of-any-user">5.1. Get the profile of any user<a class="headerlink" href="#51-get-the-profile-of-any-user" title="Permanent link">¶</a></h3>
|
|
<p>Now that you are a superuser, you can leverage the power of <a href="../routes/#superuser">superuser routes</a>. You can for example get the profile of any user in the database given its id.</p>
|
|
<h4 id="request_5">Request<a class="headerlink" href="#request_5" title="Permanent link">¶</a></h4>
|
|
<div class="tabbed-set" data-tabs="6:2"><input checked="checked" id="__tabbed_6_1" name="__tabbed_6" type="radio" /><label for="__tabbed_6_1">cURL</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code>curl <span class="se">\</span>
|
|
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
-H <span class="s2">"Authorization: Bearer </span><span class="nv">$TOKEN</span><span class="s2">"</span> <span class="se">\</span>
|
|
-X GET <span class="se">\</span>
|
|
http://localhost:8000/users/4fd3477b-eccf-4ee3-8f7d-68ad72261476
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
<input id="__tabbed_6_2" name="__tabbed_6" type="radio" /><label for="__tabbed_6_2">axios</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">axios</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span>
|
|
<span class="s1">'http://localhost:8000/users/4fd3477b-eccf-4ee3-8f7d-68ad72261476'</span><span class="p">,</span> <span class="p">{</span>
|
|
<span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
|
|
<span class="s1">'Authorization'</span><span class="o">:</span> <span class="sb">`Bearer </span><span class="si">${</span><span class="nx">TOKEN</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">})</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">))</span>
|
|
<span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<h4 id="response_5">Response<a class="headerlink" href="#response_5" title="Permanent link">¶</a></h4>
|
|
<p>You'll get a JSON response looking like this:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"4fd3477b-eccf-4ee3-8f7d-68ad72261476"</span><span class="p">,</span>
|
|
<span class="nt">"email"</span><span class="p">:</span> <span class="s2">"king.arthur@camelot.bt"</span><span class="p">,</span>
|
|
<span class="nt">"is_active"</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"is_superuser"</span><span class="p">:</span> <span class="kc">false</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
|
|
<h3 id="51-update-any-user">5.1. Update any user<a class="headerlink" href="#51-update-any-user" title="Permanent link">¶</a></h3>
|
|
<p>We can now update the profile of any user. For example, we can promote it as superuser.</p>
|
|
<h4 id="request_6">Request<a class="headerlink" href="#request_6" title="Permanent link">¶</a></h4>
|
|
<div class="tabbed-set" data-tabs="7:2"><input checked="checked" id="__tabbed_7_1" name="__tabbed_7" type="radio" /><label for="__tabbed_7_1">cURL</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code>curl <span class="se">\</span>
|
|
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
-H <span class="s2">"Authorization: Bearer </span><span class="nv">$TOKEN</span><span class="s2">"</span> <span class="se">\</span>
|
|
-X PATCH <span class="se">\</span>
|
|
-d <span class="s2">"{\"is_superuser\": true}"</span> <span class="se">\</span>
|
|
http://localhost:8000/users/4fd3477b-eccf-4ee3-8f7d-68ad72261476
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
<input id="__tabbed_7_2" name="__tabbed_7" type="radio" /><label for="__tabbed_7_2">axios</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">axios</span><span class="p">.</span><span class="nx">patch</span><span class="p">(</span>
|
|
<span class="s1">'http://localhost:8000/users/4fd3477b-eccf-4ee3-8f7d-68ad72261476'</span><span class="p">,</span>
|
|
<span class="p">{</span>
|
|
<span class="nx">is_superuser</span>: <span class="kt">true</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">{</span>
|
|
<span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
|
|
<span class="s1">'Authorization'</span><span class="o">:</span> <span class="sb">`Bearer </span><span class="si">${</span><span class="nx">TOKEN</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">},</span>
|
|
<span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">))</span>
|
|
<span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<h4 id="response_6">Response<a class="headerlink" href="#response_6" title="Permanent link">¶</a></h4>
|
|
<p>You'll get a JSON response looking like this:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="nt">"id"</span><span class="p">:</span> <span class="s2">"4fd3477b-eccf-4ee3-8f7d-68ad72261476"</span><span class="p">,</span>
|
|
<span class="nt">"email"</span><span class="p">:</span> <span class="s2">"king.arthur@camelot.bt"</span><span class="p">,</span>
|
|
<span class="nt">"is_active"</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
|
|
<span class="nt">"is_superuser"</span><span class="p">:</span> <span class="kc">true</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
|
|
<h3 id="52-delete-any-user">5.2. Delete any user<a class="headerlink" href="#52-delete-any-user" title="Permanent link">¶</a></h3>
|
|
<p>Finally, we can delete a user.</p>
|
|
<h4 id="request_7">Request<a class="headerlink" href="#request_7" title="Permanent link">¶</a></h4>
|
|
<div class="tabbed-set" data-tabs="8:2"><input checked="checked" id="__tabbed_8_1" name="__tabbed_8" type="radio" /><label for="__tabbed_8_1">cURL</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code>curl <span class="se">\</span>
|
|
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
-H <span class="s2">"Authorization: Bearer </span><span class="nv">$TOKEN</span><span class="s2">"</span> <span class="se">\</span>
|
|
-X DELETE <span class="se">\</span>
|
|
http://localhost:8000/users/4fd3477b-eccf-4ee3-8f7d-68ad72261476
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
<input id="__tabbed_8_2" name="__tabbed_8" type="radio" /><label for="__tabbed_8_2">axios</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">axios</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span>
|
|
<span class="s1">'http://localhost:8000/users/4fd3477b-eccf-4ee3-8f7d-68ad72261476'</span><span class="p">,</span>
|
|
<span class="p">{</span>
|
|
<span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
|
|
<span class="s1">'Authorization'</span><span class="o">:</span> <span class="sb">`Bearer </span><span class="si">${</span><span class="nx">TOKEN</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">},</span>
|
|
<span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">))</span>
|
|
<span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<h4 id="response_7">Response<a class="headerlink" href="#response_7" title="Permanent link">¶</a></h4>
|
|
<p>You'll get an empty response.</p>
|
|
<h2 id="6-logout">6. Logout<a class="headerlink" href="#6-logout" title="Permanent link">¶</a></h2>
|
|
<p>We can also end the session. Note that it doesn't apply to every <a href="../../configuration/authentication/">authentication backends</a>. For JWT, it doesn't make sense to end the session, the token is valid until it expires. However, for Cookie backend, the server will clear the cookie.</p>
|
|
<h3 id="request_8">Request<a class="headerlink" href="#request_8" title="Permanent link">¶</a></h3>
|
|
<div class="tabbed-set" data-tabs="9:2"><input checked="checked" id="__tabbed_9_1" name="__tabbed_9" type="radio" /><label for="__tabbed_9_1">cURL</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code>curl <span class="se">\</span>
|
|
-H <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
-H <span class="s2">"Authorization: Bearer </span><span class="nv">$TOKEN</span><span class="s2">"</span> <span class="se">\</span>
|
|
-X POST <span class="se">\</span>
|
|
http://localhost:8000/auth/cookie/logout
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
<input id="__tabbed_9_2" name="__tabbed_9" type="radio" /><label for="__tabbed_9_2">axios</label><div class="tabbed-content">
|
|
<div class="highlight"><pre><span></span><code><span class="nx">axios</span><span class="p">.</span><span class="nx">post</span><span class="p">(</span><span class="s1">'http://localhost:8000/auth/cookie/logout'</span><span class="p">,</span>
|
|
<span class="kc">null</span><span class="p">,</span>
|
|
<span class="p">{</span>
|
|
<span class="nx">headers</span><span class="o">:</span> <span class="p">{</span>
|
|
<span class="s1">'Authorization'</span><span class="o">:</span> <span class="sb">`Bearer </span><span class="si">${</span><span class="nx">TOKEN</span><span class="si">}</span><span class="sb">`</span><span class="p">,</span>
|
|
<span class="p">},</span>
|
|
<span class="p">}</span>
|
|
<span class="p">)</span>
|
|
<span class="p">.</span><span class="nx">then</span><span class="p">((</span><span class="nx">response</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">response</span><span class="p">))</span>
|
|
<span class="p">.</span><span class="k">catch</span><span class="p">((</span><span class="nx">error</span><span class="p">)</span> <span class="o">=></span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>
|
|
</code></pre></div>
|
|
|
|
</div>
|
|
</div>
|
|
<h3 id="response_8">Response<a class="headerlink" href="#response_8" title="Permanent link">¶</a></h3>
|
|
<p>You'll get an empty response.</p>
|
|
<h2 id="conclusion">Conclusion<a class="headerlink" href="#conclusion" title="Permanent link">¶</a></h2>
|
|
<p>That's it! You now have a good overview of how you can manage the users through the API. Be sure to check the <a href="../routes/">Routes</a> page to have all the details about each endpoints.</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</article>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
|
|
|
|
<footer class="md-footer">
|
|
|
|
<div class="md-footer-nav">
|
|
<nav class="md-footer-nav__inner md-grid" aria-label="Footer">
|
|
|
|
<a href="../../configuration/oauth/" title="OAuth2" class="md-footer-nav__link md-footer-nav__link--prev" rel="prev">
|
|
<div class="md-footer-nav__button md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z"/></svg>
|
|
</div>
|
|
<div class="md-footer-nav__title">
|
|
<div class="md-ellipsis">
|
|
<span class="md-footer-nav__direction">
|
|
Previous
|
|
</span>
|
|
OAuth2
|
|
</div>
|
|
</div>
|
|
</a>
|
|
|
|
|
|
<a href="../routes/" title="Routes" class="md-footer-nav__link md-footer-nav__link--next" rel="next">
|
|
<div class="md-footer-nav__title">
|
|
<div class="md-ellipsis">
|
|
<span class="md-footer-nav__direction">
|
|
Next
|
|
</span>
|
|
Routes
|
|
</div>
|
|
</div>
|
|
<div class="md-footer-nav__button md-icon">
|
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z"/></svg>
|
|
</div>
|
|
</a>
|
|
|
|
</nav>
|
|
</div>
|
|
|
|
<div class="md-footer-meta md-typeset">
|
|
<div class="md-footer-meta__inner md-grid">
|
|
<div class="md-footer-copyright">
|
|
|
|
Made with
|
|
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
|
Material for MkDocs
|
|
</a>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
|
|
<script src="../../assets/javascripts/vendor.d710d30a.min.js"></script>
|
|
<script src="../../assets/javascripts/bundle.5f27aba8.min.js"></script><script id="__lang" type="application/json">{"clipboard.copy": "Copy to clipboard", "clipboard.copied": "Copied to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.result.placeholder": "Type to start searching", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents"}</script>
|
|
|
|
<script>
|
|
app = initialize({
|
|
base: "../..",
|
|
features: [],
|
|
search: Object.assign({
|
|
worker: "../../assets/javascripts/worker/search.27c6a5e6.min.js"
|
|
}, typeof search !== "undefined" && search)
|
|
})
|
|
</script>
|
|
|
|
|
|
</body>
|
|
</html> |