#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
Этот код отлично работает, если я использую токен, сгенерированный машиной, для машины, подключенной к API
Однако (как вы можете видеть на фотографии) СПА-центр не нуждается в авторизации, как приложения M2M. Вместо этого им нужен неявный грант SPA.
Когда вы используете поле для входа, предоставленное Auth0, оно выдает вам токен после успешного входа в систему, я хочу использовать этот токен
Надеюсь, я правильно объяснился
Комментарии:
1. Можете ли вы предоставить часть своего кода?