Авторизация FastApi Auth0 с помощью одностраничных приложений

#amazon-web-services #api #auth0 #fastapi

#amazon-веб-сервисы #API #auth0 #быстрый переход

Вопрос:

Мне удалось заставить его работать, отправив токен в панель управления Auth0 и скопировав его.

Однако мне нужно связать аутентификацию с полем входа в систему, в котором используется приложение с одной страницей (SPA).

Насколько я понимаю, API-интерфейсы доступны из SPA с неявным предоставлением, но я не знаю, как это сделать.

JWT, который я получаю при входе в поле входа (используя пользователя в базе данных арендатора), больше, чем JWT в «Разделе тестирования» API. И когда я отправляю запрос на отправку в конечную точку API с заголовком «JWTtoken на предъявителя», я получаю «Недопустимый эмитент»и/или «Недопустимая аудитория».

Есть какие-нибудь идеи?

Редактировать:

app.py

 STAGE = os.environ.get("STAGE") app = FastAPI(title="FastAPI x AWS Lambda") #######################################  token_auth_scheme = HTTPBearer() async def authorize(token: str= Depends(token_auth_scheme)):  result = VerifyToken(token.credentials).verify()  if result.get("status"):  raise HTTPException(HTTPStatus.FORBIDDEN, detail=result)  ############################################ #Test endpoint @app.get("/hello") async def hello_api(name: str = "World", token: str= Depends(token_auth_scheme)):  result = VerifyToken(token.credentials).verify() # 👈 updated code  if result.get("status"):  raise HTTPException(HTTPStatus.FORBIDDEN, detail=result)  return {"hello": name}   

auth.py (скопировано из блога auth0)

  def set_up():  """Sets up configuration for the app"""   env = os.getenv("ENV", ".config")   if env == ".config":  config = ConfigParser()  config.read(".config")  config = config["AUTH0"]  else:  config = {  "DOMAIN": os.getenv("DOMAIN", "your.domain.com"),  "API_AUDIENCE": os.getenv("API_AUDIENCE", "your.audience.com"),  "ISSUER": os.getenv("ISSUER", "https://your.domain.com/"),  "ALGORITHMS": os.getenv("ALGORITHMS", "RS256"),  }  return config  class VerifyToken():  """Does all the token verification using PyJWT"""   def __init__(self, token):  self.token = token  self.config = set_up()   # This gets the JWKS from a given URL and does processing so you can  # use any of the keys available  jwks_url = f'https://{self.config["DOMAIN"]}/.well-known/jwks.json'  self.jwks_client = jwt.PyJWKClient(jwks_url)   def verify(self):  # This gets the 'kid' from the passed token  try:  self.signing_key = self.jwks_client.get_signing_key_from_jwt(  self.token  ).key  except jwt.exceptions.PyJWKClientError as error:  return {"status": "error", "msg": error.__str__()}  except jwt.exceptions.DecodeError as error:  return {"status": "error", "msg": error.__str__()}   try:  payload = jwt.decode(  self.token,  self.signing_key,  algorithms=self.config["ALGORITHMS"],  audience=self.config["API_AUDIENCE"],  issuer=self.config["ISSUER"],  )  except Exception as e:  return {"status": "error", "message": str(e)}   return payload  

Этот код отлично работает, если я использую токен, сгенерированный машиной, для машины, подключенной к APIa

Однако (как вы можете видеть на фотографии) СПА-центр не нуждается в авторизации, как приложения M2M. Вместо этого им нужен неявный грант SPA.

Когда вы используете поле для входа, предоставленное Auth0, оно выдает вам токен после успешного входаa в систему, я хочу использовать этот токен

Надеюсь, я правильно объяснился

Комментарии:

1. Можете ли вы предоставить часть своего кода?