diff --git a/slack_bolt/adapter/aws_lambda/handler.py b/slack_bolt/adapter/aws_lambda/handler.py index 349123783..dc59d92c9 100644 --- a/slack_bolt/adapter/aws_lambda/handler.py +++ b/slack_bolt/adapter/aws_lambda/handler.py @@ -85,6 +85,10 @@ def to_bolt_request(event) -> BoltRequest: if event["isBase64Encoded"]: body = base64.b64decode(body).decode("utf-8") cookies: Sequence[str] = event.get("cookies", []) + if cookies is None or len(cookies) == 0: + # In the case of format v1 + multiValueHeaders = event.get("multiValueHeaders", {}) + cookies = multiValueHeaders.get("Cookie", []) headers = event.get("headers", {}) headers["cookie"] = cookies return BoltRequest( diff --git a/tests/adapter_tests/aws/test_aws_lambda.py b/tests/adapter_tests/aws/test_aws_lambda.py index 99000094d..54c10200d 100644 --- a/tests/adapter_tests/aws/test_aws_lambda.py +++ b/tests/adapter_tests/aws/test_aws_lambda.py @@ -5,6 +5,7 @@ from moto import mock_lambda from slack_sdk.signature import SignatureVerifier from slack_sdk.web import WebClient +from slack_sdk.oauth import OAuthStateStore from slack_bolt.adapter.aws_lambda import SlackRequestHandler from slack_bolt.adapter.aws_lambda.handler import not_found @@ -318,3 +319,46 @@ def test_oauth(self): assert response["statusCode"] == 200 assert response["headers"]["content-type"] == "text/html; charset=utf-8" assert "https://slack.com/oauth/v2/authorize?state=" in response.get("body") + + @mock_lambda + def test_oauth_redirect(self): + class TestStateStore(OAuthStateStore): + def consume(self, state: str) -> bool: + return state == "uuid4-value" + + app = App( + client=self.web_client, + signing_secret=self.signing_secret, + oauth_settings=OAuthSettings( + client_id="111.111", + client_secret="xxx", + scopes=["chat:write", "commands"], + state_store=TestStateStore(), + ), + ) + + event = { + "body": "", + "queryStringParameters": {"code": "1234567890", "state": "uuid4-value"}, + "headers": {}, + "cookies": ["slack-app-oauth-state=uuid4-value"], + "requestContext": {"http": {"method": "GET"}}, + "isBase64Encoded": False, + } + response = SlackRequestHandler(app).handle(event, self.context) + assert response["statusCode"] == 200 + assert response["headers"]["content-type"] == "text/html; charset=utf-8" + assert response.get("body") is not None + + event = { + "body": "", + "queryStringParameters": {"code": "1234567890", "state": "uuid4-value"}, + "headers": {}, + "multiValueHeaders": {"Cookie": ["slack-app-oauth-state=uuid4-value"]}, + "requestContext": {"httpMethod": "GET"}, + "isBase64Encoded": False, + } + response = SlackRequestHandler(app).handle(event, self.context) + assert response["statusCode"] == 200 + assert response["headers"]["content-type"] == "text/html; charset=utf-8" + assert response.get("body") is not None