]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
:sparkles: Add util class for OAuth2 Password Bearer scheme
authorSebastián Ramírez <tiangolo@gmail.com>
Mon, 10 Dec 2018 16:10:46 +0000 (20:10 +0400)
committerSebastián Ramírez <tiangolo@gmail.com>
Mon, 10 Dec 2018 16:11:14 +0000 (20:11 +0400)
fastapi/security/__init__.py
fastapi/security/oauth2.py

index ba66dd54e247cce5eae061ee44d680388eded946..738cb8e52378091e4d2e70dbab12ace4c3c39e1b 100644 (file)
@@ -1,4 +1,4 @@
 from .api_key import APIKeyQuery, APIKeyHeader, APIKeyCookie
 from .http import HTTPBasic, HTTPBearer, HTTPDigest
-from .oauth2 import OAuth2PasswordRequestForm, OAuth2
+from .oauth2 import OAuth2PasswordRequestForm, OAuth2, OAuth2PasswordBearer
 from .open_id_connect_url import OpenIdConnect
index 717a3287f17df6c11cf86036537e9b4a93711985..608fa3555db3003228b5c6ebf49c92ce2b099d50 100644 (file)
@@ -3,7 +3,9 @@ from typing import List, Optional
 from fastapi.openapi.models import OAuth2 as OAuth2Model, OAuthFlows as OAuthFlowsModel
 from fastapi.security.base import SecurityBase
 from pydantic import BaseModel, Schema
+from starlette.exceptions import HTTPException
 from starlette.requests import Request
+from starlette.status import HTTP_403_FORBIDDEN
 
 
 class OAuth2PasswordRequestData(BaseModel):
@@ -45,3 +47,20 @@ class OAuth2(SecurityBase):
 
     async def __call__(self, request: Request) -> str:
         return request.headers.get("Authorization")
+
+
+class OAuth2PasswordBearer(OAuth2):
+    def __init__(self, tokenUrl: str, scheme_name: str = None, scopes: dict = None):
+        if not scopes:
+            scopes = {}
+        flows = OAuthFlowsModel(password={"tokenUrl": tokenUrl, "scopes": scopes})
+        super().__init__(flows=flows, scheme_name=scheme_name)
+
+    async def __call__(self, request: Request) -> str:
+        authorization: str = request.headers.get("Authorization")
+        if not authorization or "Bearer " not in authorization:
+            raise HTTPException(
+                status_code=HTTP_403_FORBIDDEN, detail="Not authenticated"
+            )
+        token = authorization.replace("Bearer ", "")
+        return token