FastAPI fornece várias ferramentas, em diferentes níveis de abstração, para implementar esses recursos de segurança.
Neste exemplo, nós vamos usar o OAuth2 com o fluxo de Senha, usando um token Bearer. Fazemos isso usando a classe OAuth2PasswordBearer.
Informação
Um token "bearer" não é a única opção.
Mas é a melhor no nosso caso.
E talvez seja a melhor para a maioria dos casos, a não ser que você seja um especialista em OAuth2 e saiba exatamente o porquê de existir outras opções que se adequam melhor às suas necessidades.
Nesse caso, FastAPI também fornece as ferramentas para construir.
Quando nós criamos uma instância da classe OAuth2PasswordBearer, nós passamos pelo parâmetro tokenUrl Esse parâmetro contém a URL que o client (o frontend rodando no browser do usuário) vai usar para mandar o username e senha para obter um token.
Esse tokenUrl="token" se refere a uma URL relativa que nós não criamos ainda. Como é uma URL relativa, é equivalente a ./token.
Porque estamos usando uma URL relativa, se sua API estava localizada em https://example.com/, então irá referir-se à https://example.com/token. Mas se sua API estava localizada em https://example.com/api/v1/, então irá referir-se à https://example.com/api/v1/token.
Usar uma URL relativa é importante para garantir que sua aplicação continue funcionando, mesmo em um uso avançado tipo Atrás de um Proxy.
Esse parâmetro não cria um endpoint / path operation, mas declara que a URL /token vai ser aquela que o client deve usar para obter o token. Essa informação é usada no OpenAPI, e depois na API Interativa de documentação de sistemas.
Em breve também criaremos o atual path operation.
Informação
Se você é um "Pythonista" muito rigoroso, você pode não gostar do estilo do nome do parâmetro tokenUrl em vez de token_url.
Isso ocorre porque está utilizando o mesmo nome que está nas especificações do OpenAPI. Então, se você precisa investigar mais sobre qualquer um desses esquemas de segurança, você pode simplesmente copiar e colar para encontrar mais informações sobre isso.
A variável oauth2_scheme é um instância de OAuth2PasswordBearer, mas também é um "callable".
Esse dependência vai fornecer uma str que é atribuído ao parâmetro `token da função do path operation
A FastAPI saberá que pode usar essa dependência para definir um "esquema de segurança" no esquema da OpenAPI (e na documentação da API automática).
Detalhes técnicos
FastAPI saberá que pode usar a classe OAuth2PasswordBearer (declarada na dependência) para definir o esquema de segurança na OpenAPI porque herda de fastapi.security.oauth2.OAuth2, que por sua vez herda de fastapi.security.base.Securitybase.
Todos os utilitários de segurança que se integram com OpenAPI (e na documentação da API automática) herdam de SecurityBase, é assim que FastAPI pode saber como integrá-los no OpenAPI.
Ele irá e olhará na requisição para aquele header de Autorização, verificará se o valor é Bearer mais algum token, e vai retornar o token como uma str
Se ele não ver o header de Autorização ou o valor não tem um token Bearer, vai responder com um código de erro 401 (UNAUTHORIZED) diretamente.
Você nem precisa verificar se o token existe para retornar um erro. Você pode ter certeza de que se a sua função for executada, ela terá um str nesse token.
Você já pode experimentar na documentação interativa:
Não estamos verificando a validade do token ainda, mas isso já é um começo