1111from slack_sdk .oauth .installation_store import InstallationStore
1212from slack_sdk .web import WebClient
1313
14+ from slack_bolt .authorization import AuthorizationResult
15+ from slack_bolt .authorization .authorize import (
16+ Authorize ,
17+ InstallationStoreAuthorize ,
18+ CallableAuthorize ,
19+ )
1420from slack_bolt .error import BoltError
21+ from slack_bolt .lazy_listener .runner import LazyListenerRunner
22+ from slack_bolt .lazy_listener .thread_runner import ThreadLazyListenerRunner
23+ from slack_bolt .listener .custom_listener import CustomListener
24+ from slack_bolt .listener .listener import Listener
25+ from slack_bolt .listener .listener_error_handler import (
26+ ListenerErrorHandler ,
27+ DefaultListenerErrorHandler ,
28+ CustomListenerErrorHandler ,
29+ )
30+ from slack_bolt .listener_matcher import CustomListenerMatcher
31+ from slack_bolt .listener_matcher import builtins as builtin_matchers
32+ from slack_bolt .listener_matcher .listener_matcher import ListenerMatcher
33+ from slack_bolt .logger import get_bolt_app_logger , get_bolt_logger
1534from slack_bolt .logger .messages import (
1635 error_signing_secret_not_found ,
1736 warning_client_prioritized_and_token_skipped ,
18- warning_installation_store_prioritized_and_token_skipped ,
37+ warning_token_skipped ,
1938 error_auth_test_failure ,
2039 error_token_required ,
2140 warning_unhandled_request ,
2847 error_unexpected_listener_middleware ,
2948 error_client_invalid_type ,
3049)
31- from slack_bolt .lazy_listener .runner import LazyListenerRunner
32- from slack_bolt .lazy_listener .thread_runner import ThreadLazyListenerRunner
33- from slack_bolt .listener .custom_listener import CustomListener
34- from slack_bolt .listener .listener import Listener
35- from slack_bolt .listener .listener_error_handler import (
36- ListenerErrorHandler ,
37- DefaultListenerErrorHandler ,
38- CustomListenerErrorHandler ,
39- )
40- from slack_bolt .listener_matcher import CustomListenerMatcher
41- from slack_bolt .listener_matcher import builtins as builtin_matchers
42- from slack_bolt .listener_matcher .listener_matcher import ListenerMatcher
43- from slack_bolt .logger import get_bolt_app_logger , get_bolt_logger
4450from slack_bolt .middleware import (
4551 Middleware ,
4652 SslCheck ,
@@ -73,6 +79,7 @@ def __init__(
7379 token : Optional [str ] = None ,
7480 client : Optional [WebClient ] = None ,
7581 # for multi-workspace apps
82+ authorize : Optional [Callable [..., AuthorizationResult ]] = None ,
7683 installation_store : Optional [InstallationStore ] = None ,
7784 # for the OAuth flow
7885 oauth_settings : Optional [OAuthSettings ] = None ,
@@ -88,6 +95,8 @@ def __init__(
8895 :param signing_secret: The Signing Secret value used for verifying requests from Slack.
8996 :param token: The bot access token required only for single-workspace app.
9097 :param client: The singleton slack_sdk.WebClient instance for this app.
98+ :param authorize: The function to authorize an incoming request from Slack
99+ by checking if there is a team/user in the installation data.
91100 :param installation_store: The module offering save/find operations of installation data
92101 :param oauth_settings: The settings related to Slack app installation flow (OAuth flow)
93102 :param oauth_flow: Manually instantiated slack_bolt.oauth.OAuthFlow.
@@ -123,7 +132,18 @@ def __init__(
123132 else :
124133 self ._client = create_web_client (token ) # NOTE: the token here can be None
125134
135+ self ._authorize : Optional [Authorize ] = None
136+ if authorize is not None :
137+ self ._authorize = CallableAuthorize (
138+ logger = self ._framework_logger , func = authorize
139+ )
140+
126141 self ._installation_store : Optional [InstallationStore ] = installation_store
142+ if self ._installation_store is not None and self ._authorize is None :
143+ self ._authorize = InstallationStoreAuthorize (
144+ installation_store = self ._installation_store ,
145+ logger = self ._framework_logger ,
146+ )
127147
128148 self ._oauth_flow : Optional [OAuthFlow ] = None
129149 if oauth_flow :
@@ -132,6 +152,8 @@ def __init__(
132152 self ._installation_store = self ._oauth_flow .settings .installation_store
133153 if self ._oauth_flow ._client is None :
134154 self ._oauth_flow ._client = self ._client
155+ if self ._authorize is None :
156+ self ._authorize = self ._oauth_flow .settings .authorize
135157 elif oauth_settings is not None :
136158 if self ._installation_store :
137159 # Consistently use a single installation_store
@@ -140,12 +162,14 @@ def __init__(
140162 self ._oauth_flow = OAuthFlow (
141163 client = self .client , logger = self .logger , settings = oauth_settings
142164 )
165+ if self ._authorize is None :
166+ self ._authorize = self ._oauth_flow .settings .authorize
143167
144- if self ._installation_store is not None and self ._token is not None :
168+ if (
169+ self ._installation_store is not None or self ._authorize is not None
170+ ) and self ._token is not None :
145171 self ._token = None
146- self ._framework_logger .warning (
147- warning_installation_store_prioritized_and_token_skipped ()
148- )
172+ self ._framework_logger .warning (warning_token_skipped ())
149173
150174 self ._middleware_list : List [Union [Callable , Middleware ]] = []
151175 self ._listeners : List [Listener ] = []
@@ -171,19 +195,23 @@ def _init_middleware_list(self):
171195 self ._middleware_list .append (RequestVerification (self ._signing_secret ))
172196
173197 if self ._oauth_flow is None :
174- if self ._token :
198+ if self ._token is not None :
175199 try :
176200 auth_test_result = self ._client .auth_test (token = self ._token )
177201 self ._middleware_list .append (
178202 SingleTeamAuthorization (auth_test_result = auth_test_result )
179203 )
180204 except SlackApiError as err :
181205 raise BoltError (error_auth_test_failure (err .response ))
206+ elif self ._authorize is not None :
207+ self ._middleware_list .append (
208+ MultiTeamsAuthorization (authorize = self ._authorize )
209+ )
182210 else :
183211 raise BoltError (error_token_required ())
184212 else :
185213 self ._middleware_list .append (
186- MultiTeamsAuthorization (installation_store = self ._installation_store )
214+ MultiTeamsAuthorization (authorize = self ._authorize )
187215 )
188216 self ._middleware_list .append (IgnoringSelfEvents ())
189217 self ._middleware_list .append (UrlVerification ())
0 commit comments