Skip to content

Commit 8b2761f

Browse files
tracyboehrerTracy Boehrer
and
Tracy Boehrer
authored
Teams SSO and OAuth fixes (#2226) (#2228)
* Fixed Teams SSO & OAuth * Formatting --------- Co-authored-by: Tracy Boehrer <trboehre@microsoft.com>
1 parent 13ee2f2 commit 8b2761f

File tree

17 files changed

+110
-22
lines changed

17 files changed

+110
-22
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
aiohttp==3.10.11
1+
aiohttp
22
pyslack
33
botbuilder-core==4.17.0
44
slackclient

libraries/botbuilder-ai/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
"azure-cognitiveservices-language-luis==0.2.0",
99
"botbuilder-schema==4.17.0",
1010
"botbuilder-core==4.17.0",
11-
"aiohttp==3.10.11",
11+
"aiohttp>=3.10,<4.0",
1212
]
1313

1414
TESTS_REQUIRES = ["aiounittest>=1.1.0"]

libraries/botbuilder-core/botbuilder/core/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
from .user_state import UserState
4949
from .register_class_middleware import RegisterClassMiddleware
5050
from .adapter_extensions import AdapterExtensions
51+
from .serializer_helper import serializer_helper
5152

5253
__all__ = [
5354
"ActivityHandler",
@@ -100,5 +101,6 @@
100101
"TurnContext",
101102
"UserState",
102103
"UserTokenProvider",
104+
"serializer_helper",
103105
"__version__",
104106
]

libraries/botbuilder-core/botbuilder/core/activity_handler.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,12 +478,19 @@ async def on_invoke_activity( # pylint: disable=unused-argument
478478
if (
479479
turn_context.activity.name
480480
== SignInConstants.verify_state_operation_name
481-
or turn_context.activity.name
482-
== SignInConstants.token_exchange_operation_name
483481
):
484482
await self.on_sign_in_invoke(turn_context)
485483
return self._create_invoke_response()
486484

485+
# This is for back-compat with previous versions of Python SDK. This method does not
486+
# exist in the C# SDK, and is not used in the Python SDK.
487+
if (
488+
turn_context.activity.name
489+
== SignInConstants.token_exchange_operation_name
490+
):
491+
await self.on_teams_signin_token_exchange(turn_context)
492+
return self._create_invoke_response()
493+
487494
if turn_context.activity.name == "adaptiveCard/action":
488495
invoke_value = self._get_adaptive_card_invoke_value(
489496
turn_context.activity

libraries/botbuilder-core/botbuilder/core/teams/teams_activity_handler.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,6 @@ async def on_invoke_activity(self, turn_context: TurnContext) -> InvokeResponse:
5656
):
5757
return await self.on_teams_card_action_invoke(turn_context)
5858

59-
if (
60-
turn_context.activity.name
61-
== SignInConstants.token_exchange_operation_name
62-
):
63-
await self.on_teams_signin_token_exchange(turn_context)
64-
return self._create_invoke_response()
65-
6659
if turn_context.activity.name == "fileConsent/invoke":
6760
return await self.on_teams_file_consent(
6861
turn_context,
@@ -250,7 +243,9 @@ async def on_teams_signin_verify_state(self, turn_context: TurnContext):
250243
raise _InvokeResponseException(status_code=HTTPStatus.NOT_IMPLEMENTED)
251244

252245
async def on_teams_signin_token_exchange(self, turn_context: TurnContext):
253-
raise _InvokeResponseException(status_code=HTTPStatus.NOT_IMPLEMENTED)
246+
# This is for back-compat with previous versions of Python SDK. This method does not
247+
# exist in the C# SDK, and is not used in the Python SDK.
248+
return await self.on_teams_signin_verify_state(turn_context)
254249

255250
async def on_teams_file_consent(
256251
self,

libraries/botbuilder-core/botbuilder/core/teams/teams_sso_token_exchange_middleware.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
StoreItem,
2727
TurnContext,
2828
)
29+
from botframework.connector.auth.user_token_client import UserTokenClient
2930

3031

3132
class _TokenStoreItem(StoreItem):
@@ -147,17 +148,29 @@ async def _exchanged_token(self, turn_context: TurnContext) -> bool:
147148
token_exchange_response: TokenResponse = None
148149
aux_dict = {}
149150
if turn_context.activity.value:
150-
for prop in ["id", "connection_name", "token", "properties"]:
151+
for prop in ["id", "connectionName", "token", "properties"]:
151152
aux_dict[prop] = turn_context.activity.value.get(prop)
152153
token_exchange_request = TokenExchangeInvokeRequest(
153154
id=aux_dict["id"],
154-
connection_name=aux_dict["connection_name"],
155+
connection_name=aux_dict["connectionName"],
155156
token=aux_dict["token"],
156157
properties=aux_dict["properties"],
157158
)
158159
try:
159160
adapter = turn_context.adapter
160-
if isinstance(turn_context.adapter, ExtendedUserTokenProvider):
161+
162+
user_token_client: UserTokenClient = turn_context.turn_state.get(
163+
UserTokenClient.__name__, None
164+
)
165+
if user_token_client:
166+
# If the adapter has UserTokenClient, use it to exchange the token.
167+
token_exchange_response = await user_token_client.exchange_token(
168+
turn_context.activity.from_property.id,
169+
token_exchange_request.connection_name,
170+
turn_context.activity.channel_id,
171+
TokenExchangeRequest(token=token_exchange_request.token),
172+
)
173+
elif isinstance(turn_context.adapter, ExtendedUserTokenProvider):
161174
token_exchange_response = await adapter.exchange_token(
162175
turn_context,
163176
self._oauth_connection_name,

libraries/botbuilder-dialogs/botbuilder/dialogs/prompts/oauth_prompt.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,13 @@ async def _send_oauth_card(
341341
if sign_in_resource.token_exchange_resource
342342
else None
343343
)
344+
345+
json_token_ex_post = (
346+
sign_in_resource.token_post_resource.as_dict()
347+
if sign_in_resource.token_post_resource
348+
else None
349+
)
350+
344351
prompt.attachments.append(
345352
CardFactory.oauth_card(
346353
OAuthCard(
@@ -355,6 +362,7 @@ async def _send_oauth_card(
355362
)
356363
],
357364
token_exchange_resource=json_token_ex_resource,
365+
token_post_resource=json_token_ex_post,
358366
)
359367
)
360368
)

libraries/botbuilder-integration-aiohttp/botbuilder/integration/aiohttp/cloud_adapter.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Copyright (c) Microsoft Corporation. All rights reserved.
22
# Licensed under the MIT License.
33

4+
import json
5+
46
from typing import Awaitable, Callable, Optional
57

68
from aiohttp.web import (
@@ -17,6 +19,7 @@
1719
Bot,
1820
CloudAdapterBase,
1921
InvokeResponse,
22+
serializer_helper,
2023
TurnContext,
2124
)
2225
from botbuilder.core.streaming import (
@@ -102,7 +105,8 @@ async def process(
102105
# Write the response, serializing the InvokeResponse
103106
if invoke_response:
104107
return json_response(
105-
data=invoke_response.body, status=invoke_response.status
108+
data=serializer_helper(invoke_response.body),
109+
status=invoke_response.status,
106110
)
107111
return Response(status=201)
108112
else:
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
msrest== 0.7.*
22
botframework-connector==4.17.0
33
botbuilder-schema==4.17.0
4-
aiohttp==3.10.11
4+
aiohttp==3.*.*

libraries/botbuilder-integration-aiohttp/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"botframework-connector==4.17.0",
1111
"botbuilder-core==4.17.0",
1212
"yarl>=1.8.1",
13-
"aiohttp==3.10.11",
13+
"aiohttp>=3.10,<4.0",
1414
]
1515

1616
root = os.path.abspath(os.path.dirname(__file__))

libraries/botbuilder-integration-applicationinsights-aiohttp/setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
REQUIRES = [
88
"applicationinsights>=0.11.9",
9-
"aiohttp==3.10.11",
9+
"aiohttp>=3.10,<4.0",
1010
"botbuilder-schema==4.17.0",
1111
"botframework-connector==4.17.0",
1212
"botbuilder-core==4.17.0",

libraries/botbuilder-schema/botbuilder/schema/_models_py3.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1909,6 +1909,7 @@ class OAuthCard(Model):
19091909
"connection_name": {"key": "connectionName", "type": "str"},
19101910
"buttons": {"key": "buttons", "type": "[CardAction]"},
19111911
"token_exchange_resource": {"key": "tokenExchangeResource", "type": "object"},
1912+
"token_post_resource": {"key": "tokenPostResource", "type": "object"},
19121913
}
19131914

19141915
def __init__(
@@ -1918,13 +1919,15 @@ def __init__(
19181919
connection_name: str = None,
19191920
buttons=None,
19201921
token_exchange_resource=None,
1922+
token_post_resource=None,
19211923
**kwargs
19221924
) -> None:
19231925
super(OAuthCard, self).__init__(**kwargs)
19241926
self.text = text
19251927
self.connection_name = connection_name
19261928
self.buttons = buttons
19271929
self.token_exchange_resource = token_exchange_resource
1930+
self.token_post_resource = token_post_resource
19281931

19291932

19301933
class PagedMembersResult(Model):

libraries/botframework-connector/botframework/connector/token_api/models/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from ._models_py3 import SignInUrlResponse
1414
from ._models_py3 import TokenExchangeRequest
1515
from ._models_py3 import TokenExchangeResource
16+
from ._models_py3 import TokenPostResource
1617
from ._models_py3 import TokenResponse
1718
from ._models_py3 import TokenStatus
1819
except (SyntaxError, ImportError):
@@ -23,6 +24,7 @@
2324
from ._models import SignInUrlResponse
2425
from ._models import TokenExchangeRequest
2526
from ._models import TokenExchangeResource
27+
from ._models import TokenPostResource
2628
from ._models import TokenResponse
2729
from ._models import TokenStatus
2830

@@ -35,6 +37,7 @@
3537
"SignInUrlResponse",
3638
"TokenExchangeRequest",
3739
"TokenExchangeResource",
40+
"TokenPostResource",
3841
"TokenResponse",
3942
"TokenStatus",
4043
]

libraries/botframework-connector/botframework/connector/token_api/models/_models.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@ class SignInUrlResponse(Model):
104104
:param token_exchange_resource:
105105
:type token_exchange_resource:
106106
~botframework.tokenapi.models.TokenExchangeResource
107+
:param token_post_resource:
108+
:type token_post_resource:
109+
~botframework.tokenapi.models.TokenPostResource
107110
"""
108111

109112
_attribute_map = {
@@ -112,12 +115,17 @@ class SignInUrlResponse(Model):
112115
"key": "tokenExchangeResource",
113116
"type": "TokenExchangeResource",
114117
},
118+
"token_post_resource": {
119+
"key": "tokenPostResource",
120+
"type": "TokenPostResource",
121+
},
115122
}
116123

117124
def __init__(self, **kwargs):
118125
super(SignInUrlResponse, self).__init__(**kwargs)
119126
self.sign_in_link = kwargs.get("sign_in_link", None)
120127
self.token_exchange_resource = kwargs.get("token_exchange_resource", None)
128+
self.token_exchange_resource = kwargs.get("token_post_resource", None)
121129

122130

123131
class TokenExchangeRequest(Model):
@@ -164,6 +172,22 @@ def __init__(self, **kwargs):
164172
self.provider_id = kwargs.get("provider_id", None)
165173

166174

175+
class TokenPostResource(Model):
176+
"""TokenPostResource.
177+
178+
:param sas_url:
179+
:type id: str
180+
"""
181+
182+
_attribute_map = {
183+
"sas_url": {"key": "sasUrl", "type": "str"},
184+
}
185+
186+
def __init__(self, **kwargs):
187+
super(TokenPostResource, self).__init__(**kwargs)
188+
self.sas_url = kwargs.get("sas_url", None)
189+
190+
167191
class TokenResponse(Model):
168192
"""TokenResponse.
169193

libraries/botframework-connector/botframework/connector/token_api/models/_models_py3.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ class SignInUrlResponse(Model):
106106
:param token_exchange_resource:
107107
:type token_exchange_resource:
108108
~botframework.tokenapi.models.TokenExchangeResource
109+
:param token_post_resource:
110+
:type token_post_resource:
111+
~botframework.tokenapi.models.TokenPostResource
109112
"""
110113

111114
_attribute_map = {
@@ -114,14 +117,24 @@ class SignInUrlResponse(Model):
114117
"key": "tokenExchangeResource",
115118
"type": "TokenExchangeResource",
116119
},
120+
"token_post_resource": {
121+
"key": "tokenPostResource",
122+
"type": "TokenPostResource",
123+
},
117124
}
118125

119126
def __init__(
120-
self, *, sign_in_link: str = None, token_exchange_resource=None, **kwargs
127+
self,
128+
*,
129+
sign_in_link: str = None,
130+
token_exchange_resource=None,
131+
token_post_resource=None,
132+
**kwargs
121133
) -> None:
122134
super(SignInUrlResponse, self).__init__(**kwargs)
123135
self.sign_in_link = sign_in_link
124136
self.token_exchange_resource = token_exchange_resource
137+
self.token_post_resource = token_post_resource
125138

126139

127140
class TokenExchangeRequest(Model):
@@ -170,6 +183,22 @@ def __init__(
170183
self.provider_id = provider_id
171184

172185

186+
class TokenPostResource(Model):
187+
"""TokenPostResource.
188+
189+
:param sas_url:
190+
:type id: str
191+
"""
192+
193+
_attribute_map = {
194+
"sas_url": {"key": "sasUrl", "type": "str"},
195+
}
196+
197+
def __init__(self, *, sas_url: str = None, **kwargs) -> None:
198+
super(TokenPostResource, self).__init__(**kwargs)
199+
self.sas_url = sas_url
200+
201+
173202
class TokenResponse(Model):
174203
"""TokenResponse.
175204
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
botbuilder-core>=4.7.1
2-
aiohttp
2+
aiohttp==3.*.*
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
botbuilder-core>=4.7.1
2-
aiohttp
2+
aiohttp==3.*.*

0 commit comments

Comments
 (0)