๐ฅ, โก๏ธ ๐ ๐ ๐ ๐ ๐ โช๏ธโก๏ธ ๐ผ ๐ **๐ฐ - ๐ฉโ๐ป ๐ฆฎ** [Oauth2๏ธโฃ โฎ๏ธ ๐ (& ๐), ๐จ โฎ๏ธ ๐ฅ ๐ค](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. ๐ โ๏ธ Oauth2๏ธโฃ โ:
-```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 153"
+```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!../../../docs_src/security/tutorial005.py!}
```
โ๏ธ ๐ ๐ธ, ๐โโ, ๐ ๐ โ ๐ญ ๐ ๐ด ๐ฎ โ ๐ ๐ฉโ๐ป ๐ค ๐ช โ๏ธ, โ๏ธ ๐ ๐ โ๏ธ ๐.
-```Python hl_lines="153"
+```Python hl_lines="155"
{!../../../docs_src/security/tutorial005.py!}
```
๐ฅ ๐จ โซ๏ธ ๐ฅ ๐ฆ โ **FastAPI** ๐ต โ ๐ฃ ๐ ๐.
-```Python hl_lines="4 139 166"
+```Python hl_lines="4 139 168"
{!../../../docs_src/security/tutorial005.py!}
```
=== "๐ 3๏ธโฃ.6๏ธโฃ & ๐"
- ```Python hl_lines="115-128"
+ ```Python hl_lines="115-130"
{!> ../../../docs_src/security/tutorial004.py!}
```
=== "๐ 3๏ธโฃ.1๏ธโฃ0๏ธโฃ & ๐"
- ```Python hl_lines="114-127"
+ ```Python hl_lines="114-129"
{!> ../../../docs_src/security/tutorial004_py310.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="3 7 11 45 63 104 106-114 120-123 127-133 138 152"
+ ```Python hl_lines="3 7 11 45 63 104 106-114 120-123 127-133 138 154"
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 153"
+ ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 153"
+ ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155"
{!> ../../../docs_src/security/tutorial005.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="152"
+ ```Python hl_lines="154"
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="153"
+ ```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="153"
+ ```Python hl_lines="155"
{!> ../../../docs_src/security/tutorial005.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="3 138 165"
+ ```Python hl_lines="3 138 167"
{!> ../../../docs_src/security/tutorial005_py310.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="4 139 166"
+ ```Python hl_lines="4 139 168"
{!> ../../../docs_src/security/tutorial005_py39.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="4 139 166"
+ ```Python hl_lines="4 139 168"
{!> ../../../docs_src/security/tutorial005.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="114-127"
+ ```Python hl_lines="114-129"
{!> ../../../docs_src/security/tutorial004_py310.py!}
```
!!! tip
Prefer to use the `Annotated` version if possible.
- ```Python hl_lines="115-128"
+ ```Python hl_lines="115-130"
{!> ../../../docs_src/security/tutorial004.py!}
```
JWTใขใฏใปในใใผใฏใณใไฝๆใใใใใ่ฟใใพใใ
-```Python hl_lines="115-128"
+```Python hl_lines="115-130"
{!../../../docs_src/security/tutorial004.py!}
```
ๅๅปบๅนถ่ฟๅ็ๆญฃ็ JWT ่ฎฟ้ฎไปค็ใ
-```Python hl_lines="115-128"
+```Python hl_lines="115-130"
{!../../../docs_src/security/tutorial004.py!}
```
return current_user
-@app.post("/token", response_model=Token)
-async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
+@app.post("/token")
+async def login_for_access_token(
+ form_data: OAuth2PasswordRequestForm = Depends()
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
+@app.post("/token")
async def login_for_access_token(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
-):
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
+@app.post("/token")
async def login_for_access_token(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
-):
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
+@app.post("/token")
async def login_for_access_token(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
-):
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
-async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
+@app.post("/token")
+async def login_for_access_token(
+ form_data: OAuth2PasswordRequestForm = Depends()
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
-async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
+@app.post("/token")
+async def login_for_access_token(
+ form_data: OAuth2PasswordRequestForm = Depends()
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=400, detail="Incorrect username or password")
data={"sub": user.username, "scopes": form_data.scopes},
expires_delta=access_token_expires,
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
+@app.post("/token")
async def login_for_access_token(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
-):
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=400, detail="Incorrect username or password")
data={"sub": user.username, "scopes": form_data.scopes},
expires_delta=access_token_expires,
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
+@app.post("/token")
async def login_for_access_token(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
-):
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=400, detail="Incorrect username or password")
data={"sub": user.username, "scopes": form_data.scopes},
expires_delta=access_token_expires,
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
+@app.post("/token")
async def login_for_access_token(
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
-):
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=400, detail="Incorrect username or password")
data={"sub": user.username, "scopes": form_data.scopes},
expires_delta=access_token_expires,
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
-async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
+@app.post("/token")
+async def login_for_access_token(
+ form_data: OAuth2PasswordRequestForm = Depends()
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=400, detail="Incorrect username or password")
data={"sub": user.username, "scopes": form_data.scopes},
expires_delta=access_token_expires,
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)
return current_user
-@app.post("/token", response_model=Token)
-async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
+@app.post("/token")
+async def login_for_access_token(
+ form_data: OAuth2PasswordRequestForm = Depends()
+) -> Token:
user = authenticate_user(fake_users_db, form_data.username, form_data.password)
if not user:
raise HTTPException(status_code=400, detail="Incorrect username or password")
data={"sub": user.username, "scopes": form_data.scopes},
expires_delta=access_token_expires,
)
- return {"access_token": access_token, "token_type": "bearer"}
+ return Token(access_token=access_token, token_type="bearer")
@app.get("/users/me/", response_model=User)