Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een agent gebruikt OAuth om gebruikers in te loggen en tokens te verkrijgen voor downstream-resources (zoals Microsoft Graph) zonder zelf de inloggegevens te beheren. Azure Bot Service beheert de tokenuitwisseling en de agent haalt het resulterende gebruikerstoken tijdens een beurt op.
Overzicht
Het gebruik van OAuth in een agent omvat drie activiteiten:
- Configureer OAuth voor de Azure Bot- en app-registratie: maak één of meer OAuth-verbindingen aan voor uw Azure Bot-resource, elk ondersteund door een Microsoft Entra ID-app-registratie. Het toevoegen van gebruikersverificatie met behulp van federatieve identiteitsreferentie is de meest gebruikelijke aanpak. Andere soorten inloggegevens, zoals clientgeheimen of certificaten, worden ook ondersteund. Voor de volledige set van opties, zie basisprincipes van de Bot Service-verificatie.
- Configureer de corresponderende instellingen in de agent: elke OAuth-verbinding op de Azure Bot wordt gekoppeld aan één OAuth-handler in de configuratie van de agent. Zie Instellingen. Voor de algemene agentconfiguratie, zie Wat is de SDK voor Microsoft 365-agenten.
- Gebruik de tokens in code: haal tijdens een beurt het gebruikerstoken op – of voer een OBO-uitwisseling (On-Behalf-Of) uit – via de gebruikersverificatie-API van de agent. Zie Het token gebruiken in code (niet-OBO) en Het token gebruiken in code (OBO).
Houd de volgende concepten in gedachten terwijl u de rest van dit artikel leest:
- Een Azure Bot kan meerdere OAuth-verbindingen bevatten. Bijvoorbeeld één verbinding voor Microsoft Graph en een andere voor GitHub. Elke verbinding wordt onafhankelijk geconfigureerd op de Azure Bot.
- Er is een een-op-een-relatie tussen een OAuth-verbinding op de Azure Bot en een OAuth-handler in de agent. De
AzureBotOAuthConnectionName-instelling van een handler geeft de Azure Bot-verbinding die deze gebruikt, zijn naam. Als u twee verbindingen wilt gebruiken, definieert u twee handlers. - De gebruikersverificatie-API van de agent is de locatie die u in de code aanroept. In .NET is dit
AgentApplication.UserAuthorization– bijvoorbeeldGetTurnTokenAsyncom een token te lezen enExchangeTurnTokenAsyncom een OBO-uitwisseling uit te voeren. Equivalente locaties zijnauthorizationin JavaScript enauthin Python.
Zie voor werkende voorbeelden de voorbeelden voor automatisch inloggen en de OBO-voorbeelden:
Taalondersteuning voor OAuth
De SDK voor agenten ondersteunt OAuth voor .NET, JavaScript en Python. De kernconcepten zijn in elke taal hetzelfde: OAuth-handlers, handler koppelen aan routes en OBO-uitwisseling. Alleen het configuratieformaat en de handler-API-namen verschillen:
| Taal | Waar u configureert | API-locatie |
|---|---|---|
| .NET |
appsettings.json (of code in Program.cs) |
AgentApplication.UserAuthorization |
| JavaScript |
.env-omgevingsvariabelen |
AgentApplication.authorization |
| Python |
.env-omgevingsvariabelen |
AgentApplication.auth |
Voor JavaScript en Python gebruiken de .env-sleutels dezelfde hiërarchische namen als de appsettings.json-structuur van .NET, waarbij elk niveau gescheiden is door een dubbel onderstrepingsteken (__). JavaScript-sleutels behouden de camelCase-namen van de laatste elementen die in de tabellen worden weergegeven (bijvoorbeeld azureBotOAuthConnectionName). Python-sleutels worden in alleen hoofdletters weergegeven (bijvoorbeeld AZUREBOTOAUTHCONNECTIONNAME).
Belangrijk
Globale automatische aanmelding (AutoSignIn) en DefaultHandlerName worden alleen ondersteund in .NET. In JavaScript en Python koppelt u OAuth-handlers aan specifieke routes, zoals wordt getoond in Configuratie per route.
Instellingen
Een gebruikersverificatie-object binnen AgentApplication bepaalt hoe de agent gebruikerstokens verwerft. Elke handler geeft op zijn minst de naam op van de Azure Bot OAuth-verbinding die deze gebruikt. De volgende voorbeelden tonen de minimale structuur in elke taal. De tabellen die volgen beschrijven de rest van de beschikbare eigenschappen en de OBO-secties behandelen de OBOConnectionName- en OBOScopes-instellingen.
Configureer in .NET de gebruikersverificatie onder AgentApplication in appsettings.json:
"AgentApplication": {
"UserAuthorization": {
"DefaultHandlerName": "{{handler-name}}",
"AutoSignIn": true | false,
"Handlers": {
"{{handler-name}}": {
"Settings": {
"AzureBotOAuthConnectionName": "{{azure-bot-connection-name}}"
}
}
}
}
}
Configureer in JavaScript de gebruikersverificatie met omgevingsvariabelen in het .env-bestand:
# Connection used to authenticate the agent itself
connections__serviceConnection__settings__clientId=
connections__serviceConnection__settings__clientSecret=
connections__serviceConnection__settings__tenantId=
connectionsMap__0__connection=serviceConnection
connectionsMap__0__serviceUrl=*
# OAuth handler named "{{handler-name}}"
AgentApplication__UserAuthorization__Handlers__{{handler-name}}__Settings__azureBotOAuthConnectionName={{azure-bot-connection-name}}
Configureer in Python de gebruikersverificatie met omgevingsvariabelen in het .env-bestand:
# Connection used to authenticate the agent itself
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=
# OAuth handler named "{{handler-name}}"
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__{{handler-name}}__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME={{azure-bot-connection-name}}
UserAuthorization-eigenschappen
De volgende tabel geeft een overzicht van de eigenschappen op het hoogste niveau UserAuthorization die bepalen hoe handlers worden geselecteerd en hoe tokens worden verkregen voor elke binnenkomende activiteit.
| Eigenschap | Vereist | Type | Omschrijving |
|---|---|---|---|
DefaultHandlerName |
Nee (aanbevolen) | string | Alleen .NET. De naam van de handler die wordt gebruikt wanneer AutoSignIn evalueert naar "waar" en er geen overschrijving per route is opgegeven. |
AutoSignIn |
Nee | bool of gemachtigde | Alleen .NET. Wanneer dit waar is (standaard), probeert de agent een token te verkrijgen voor elke binnenkomende activiteit. Overschrijf dit tijdens runtime met Options.AutoSignIn om activiteitstypen te filteren. |
Handlers |
Ja (minstens één) | object (woordenboek) | Toewijzing van de naam van de handler aan zijn configuratie. Elke sleutel moet uniek zijn. |
Om in .NET te beperken op welke activiteiten automatisch aanmelden van toepassing is, stelt u een predicaat in dat vergelijkbaar is met: Options.AutoSignIn = (context, ct) => Task.FromResult(context.Activity.IsType(ActivityTypes.Message));. JavaScript en Python ondersteunen geen globale automatische aanmelding. Bepaal in plaats daarvan de scope van de aanmelding door specifieke handlernamen aan individuele routes te koppelen, zoals te zien is in de voorbeelden van configuratie per route .
Instellingseigenschappen
De volgende tabel beschrijft het geneste Settings object dat wordt toegepast op een individuele OAuth-handler en dat de weergave van de aanmeldingskaart, het herhalingsgedrag, de time-outs en de optionele OBO-uitwisselingsconfiguratie beheert.
| Eigenschap | Vereist | Type | Omschrijving |
|---|---|---|---|
AzureBotOAuthConnectionName |
Ja | string | De OAuth-verbindingsnaam die is gedefinieerd in de Azure Bot-resource. |
OBOConnectionName |
Nee (alleen OBO) | string | Naam van een Agents SDK-verbinding die wordt gebruikt om een On-Behalf-Of-tokenuitwisseling uit te voeren. |
OBOScopes |
Nee (alleen OBO) | string[] | Scopes aangevraagd tijdens OBO-uitwisseling. Indien weggelaten met OBOConnectionName, kunt u ExchangeTurnTokenAsync handmatig aanroepen. |
Title |
Nee | string | Aangepaste titel van de aanmeldkaart. Standaard is Aanmelden. |
Text |
Nee | string | Tekst van de knop op de aanmeldkaart. Standaard is Meld u aan. |
InvalidSignInRetryMax |
Nee | int | Maximaal aantal toegestane pogingen wanneer de gebruiker een ongeldige code invoert. Standaard is 2. |
InvalidSignInRetryMessage |
Nee | string | Bericht dat wordt weergegeven na het invoeren van een ongeldige code. Standaard is Ongeldige aanmeldcode. Voer de 6-cijferige code in. |
Timeout |
Nee | int (ms) | Aantal milliseconden voordat een aanmeldingspoging verloopt. De standaardwaarde is 900000 (15 minuten). |
Notitie
AzureBotOAuthConnectionName, OBOConnectionName, OBOScopes, Title en Text zijn van toepassing op alle drie de talen (met gebruik van de per taal beschreven schrijfwijze van sleutels, zoals is beschreven in Taalondersteuning voor OAuth).
InvalidSignInRetryMax, InvalidSignInRetryMessage en Timeout zijn .NET-instellingen.
Welk type moet u gebruiken?
Gebruik de volgende tabel om te bepalen welke aanpak het beste bij uw scenario past.
| Keuze | Wanneer gebruiken |
|---|---|
| Automatische aanmelding (alleen .NET) | U wilt dat elke inkomende activiteit automatisch een token verwerft of u wilt een gefilterde subset (bijvoorbeeld alleen berichten of alles behalve gebeurtenissen) door een predicaat op te geven aan UserAuthorizationOptions.AutoSignIn. Alleen ondersteund in .NET. |
| Per route | Alleen specifieke routehandlers hebben tokens nodig of verschillende routes moeten verschillende OAuth-verbindingen (en dus verschillende tokens) gebruiken. Deze optie is de enige optie in JavaScript en Python. In .NET is dit een aanvullende mogelijkheid naast de globale automatische aanmelding. Als beide zijn ingeschakeld in .NET, heeft de beurt toegang tot tokens van beide. |
Het token gebruiken in code (niet-OBO)
In deze sectie wordt beschreven hoe u het gebruikerstoken dat rechtstreeks door uw Azure Bot OAuth-verbinding wordt geretourneerd, kunt ophalen en gebruiken zonder een On-Behalf-Of-uitwisseling uit te voeren. In .NET kunt u de globale automatische aanmelding of handlers per route gebruiken. JavaScript en Python gebruiken alleen handlers per route. Haal binnen uw activiteitenhandler het token (GetTurnTokenAsync in .NET, authorization.getToken in JavaScript, auth.get_token in Python) zo laat mogelijk op, zodat de SDK het token kan vernieuwen als het bijna verloopt. De volgende voorbeelden illustreren beide patronen.
Automatische aanmelding (alleen .NET)
Notitie
Globale automatische aanmelding en DefaultHandlerName zijn alleen beschikbaar in .NET. Gebruik voor JavaScript en Python configuratie per route.
Gebruik deze configuratie wanneer de globale automatische aanmelding een token moet verwerven voor elke binnenkomende activiteit zonder dat er handlers per route hoeven te worden gespecificeerd.
"AgentApplication": {
"UserAuthorization": {
"DefaultHandlerName": "auto",
"Handlers": {
"auto": {
"Settings": {
"AzureBotOAuthConnectionName": "teams_sso",
}
}
}
}
},
Uw agentcode zou er ongeveer als volgt uitzien:
public class MyAgent : AgentApplication
{
[MessageRoute]
public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
var token = await UserAuthorization.GetTurnTokenAsync(turnContext);
// use the token
}
}
Configuratie per route
Gebruik een configuratie per route wanneer u fijnmazige controle wilt: alleen de routes die u expliciet markeert, verwerven tokens. Configuratie per route heeft de volgende voordelen:
- Het vermindert het onnodig ophalen van tokens.
- Hiermee kunt u verschillende routes aan verschillende OAuth-verbindingen koppelen (en daarmee aan verschillende resources of scopes)
- Hiermee kunt u routes met en zonder authenticatie binnen dezelfde agent combineren.
In het volgende voorbeeld is één graph-handler alleen gekoppeld aan de berichtroute.
In .NET is globale automatische aanmelding uitgeschakeld en wordt de graph-handler aan de route gekoppeld met behulp van autoSignInHandlers.
"AgentApplication": {
"UserAuthorization": {
"AutoSignIn": false,
"Handlers": {
"graph": {
"Settings": {
"AzureBotOAuthConnectionName": "teams_sso",
}
}
}
}
},
Uw agentcode zou er ongeveer als volgt uitzien:
public class MyAgent : AgentApplication
{
[MessageRoute(autoSignInHandlers: "graph")]
public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
var token = await UserAuthorization.GetTurnTokenAsync(turnContext, "graph");
// use the token
}
}
Geef in JavaScript een matrix van handlernamen als laatste argument door aan de routeregistratie. Alleen die route triggert de aanmelding voor de graph-handler.
AgentApplication__UserAuthorization__Handlers__graph__Settings__azureBotOAuthConnectionName=teams_sso
AgentApplication__UserAuthorization__Handlers__graph__Settings__title=Graph Sign In
AgentApplication__UserAuthorization__Handlers__graph__Settings__text=Sign in with Microsoft Graph
Uw agentcode zou er ongeveer als volgt uitzien:
class MyAgent extends AgentApplication {
constructor () {
super({ storage: new MemoryStorage() })
// the `graph` handler runs only for this route
this.onMessage('-me', this._profileRequest, ['graph'])
}
private _profileRequest = async (context, state) => {
const tokenResponse = await this.authorization.getToken(context, 'graph')
// use tokenResponse.token
}
}
Geef in Python auth_handlers door aan de route-decorator. Alleen die route triggert de aanmelding voor de GRAPH-handler.
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=teams_sso
Uw agentcode zou er ongeveer als volgt uitzien:
@AGENT_APP.message(re.compile(r"^/(me|profile)$", re.IGNORECASE), auth_handlers=["GRAPH"])
async def profile_request(context: TurnContext, state: TurnState) -> None:
token_response = await AGENT_APP.auth.get_token(context, "GRAPH")
# use token_response.token
Het token ophalen tijdens een beurt
Haal het gebruikerstoken op wanneer u dat nodig hebt tijdens een beurt. U kunt het token meerdere keren aanroepen. Roep het token vlak vóór het gebruik aan, zodat de vernieuwingslogica (indien nodig) transparant wordt afgehandeld.
| Taal | Bellen |
|---|---|
| .NET |
GetTurnTokenAsync(turnContext, handlerName) |
| JavaScript | authorization.getToken(context, handlerName) |
| Python | auth.get_token(context, handler_name) |
Het token gebruiken in code (OBO)
On-Behalf-Of (OBO) is gebaseerd op het feit dat de initiële gebruikersaanmelding een inwisselbaar token retourneert. Dit vereist dat de scopes van de OAuth-verbinding er een bevatten die overeenkomt met een scope die door de downstream API wordt blootgesteld (bijvoorbeeld als de blootgestelde scope defaultScopes is, kan de geconfigureerde scope api://botid-{{clientId}}/defaultScopes zijn). De Agents SDK voert vervolgens een Microsoft Authentication Library (MSAL)-uitwisseling uit met behulp van een geconfigureerde verbinding die wordt geïdentificeerd door OBOConnectionName en de lijst van OBOScopes. Wanneer zowel OBOConnectionName als OBOScopes in de configuratie aanwezig zijn, vindt de uitwisseling automatisch plaats en verkrijgt u het uiteindelijke token via de standaard token-aanroep (GetTurnTokenAsync / getToken / get_token). Als een van beide ontbreekt, kunt u de uitwisseling expliciet tijdens runtime uitvoeren (ExchangeTurnTokenAsync in .NET, authorization.exchangeToken in JavaScript, auth.exchange_token in Python), zodat u de verbinding of lijst met scopes dynamisch kunt bepalen.
OBO in configuratie
Gebruik dit patroon wanneer u de downstreambron en toegangsniveaus kent, die u nodig hebt tijdens de configuratie. Wanneer u zowel OBOConnectionName als OBOScopes opgeeft, voert de SDK automatisch de On-Behalf-Of-uitwisseling uit tijdens het aanmelden. Dit betekent dat volgende aanroepen van de standaardfunctie voor het ophalen van tokens het OBO-token direct retourneren zonder dat er extra runtimecode nodig is.
"AgentApplication": {
"UserAuthorization": {
"AutoSignIn": false,
"Handlers": {
"graph": {
"Settings": {
"AzureBotOAuthConnectionName": "teams_sso",
"OBOConnectionName": "ServiceConnection",
"OBOScopes": [
"https://graph.microsoft.com/.default"
]
}
}
}
}
},
"Connections": {
"ServiceConnection": {
"Settings": {
"AuthType": "FederatedCredentials",
"AuthorityEndpoint": "https://login.microsoftonline.com/{{TenantId}}",
"ClientId": "{{ClientId}}",
"FederatedClientId": "{{ManagedIdentityClientId}}",
"Scopes": [
"https://api.botframework.com/.default"
]
}
}
},
Uw agentcode zou er ongeveer als volgt uitzien:
public class MyAgent : AgentApplication
{
[MessageRoute(autoSignInHandlers: "graph")]
public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
// returns the OBO token because OBOConnectionName and OBOScopes are configured
var token = await UserAuthorization.GetTurnTokenAsync(turnContext, "graph");
// use the token
}
}
Definieer in JavaScript een OBO-verbinding in de map met verbindingen en verwijs er vanuit de handler naar met oboConnectionName en oboScopes.
# Agent's own connection
connections__serviceConnection__settings__clientId=
connections__serviceConnection__settings__clientSecret=
connections__serviceConnection__settings__tenantId=
# OBO connection
connections__oboConnection__settings__clientId=
connections__oboConnection__settings__clientSecret=
connections__oboConnection__settings__tenantId=
connectionsMap__0__connection=serviceConnection
connectionsMap__0__serviceUrl=*
connectionsMap__1__connection=oboConnection
connectionsMap__1__serviceUrl=obo
AgentApplication__UserAuthorization__Handlers__graph__Settings__azureBotOAuthConnectionName=teams_sso
AgentApplication__UserAuthorization__Handlers__graph__Settings__oboConnectionName=oboConnection
AgentApplication__UserAuthorization__Handlers__graph__Settings__oboScopes=https://graph.microsoft.com/.default
Uw agentcode zou er ongeveer als volgt uitzien:
class MyAgent extends AgentApplication {
constructor () {
super({ storage: new MemoryStorage() })
this.onActivity('message', this._onMessage, ['graph'])
}
private _onMessage = async (context, state) => {
// returns the OBO token because oboConnectionName and oboScopes are configured
const tokenResponse = await this.authorization.getToken(context, 'graph')
// use tokenResponse.token
}
}
Definieer in Python een OBO-verbinding onder CONNECTIONS en verwijs ernaar vanuit de handler met OBOCONNECTIONNAME en OBOSCOPES.
# Agent's own connection
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=
# OBO connection
CONNECTIONS__OBO__SETTINGS__CLIENTID=
CONNECTIONS__OBO__SETTINGS__CLIENTSECRET=
CONNECTIONS__OBO__SETTINGS__TENANTID=
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=teams_sso
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__OBOCONNECTIONNAME=OBO
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__OBOSCOPES=https://graph.microsoft.com/.default
Uw agentcode zou er ongeveer als volgt uitzien:
@AGENT_APP.message(re.compile(r".*"), auth_handlers=["GRAPH"])
async def on_message(context: TurnContext, state: TurnState) -> None:
# returns the OBO token because OBOCONNECTIONNAME and OBOSCOPES are configured
token_response = await AGENT_APP.auth.get_token(context, "GRAPH")
# use token_response.token
OBO Exchange tijdens runtime
Gebruik een uitwisseling tijdens runtime wanneer u de downstream-resource, scopes of verbinding in de configuratie niet kunt vastleggen. Deze situatie doet zich bijvoorbeeld voor wanneer scopes afhankelijk zijn van tenant, gebruikersrol of een functievlag. In dit model configureert u optioneel de OBO-verbinding en roept u vervolgens de uitwisselingsmethode aan met de scopes die u tijdens de beurt bepaalt. U ontvangt een uitgewisseld token dat u direct kunt toepassen.
Roep ExchangeTurnTokenAsync aan met de scopes die u op het moment van beurt bepaalt.
"AgentApplication": {
"UserAuthorization": {
"AutoSignIn": false,
"Handlers": {
"graph": {
"Settings": {
"AzureBotOAuthConnectionName": "teams_sso",
"OBOConnectionName": "ServiceConnection"
}
}
}
}
},
"Connections": {
"ServiceConnection": {
"Settings": {
"AuthType": "FederatedCredentials",
"AuthorityEndpoint": "https://login.microsoftonline.com/{{TenantId}}",
"ClientId": "{{ClientId}}",
"FederatedClientId": "{{ManagedIdentityClientId}}",
"Scopes": [
"https://api.botframework.com/.default"
]
}
}
},
Uw agentcode zou er ongeveer als volgt uitzien:
public class MyAgent : AgentApplication
{
[MessageRoute(autoSignInHandlers: "graph")]
public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
var scopes = GetScopes();
var exchangedToken = await UserAuthorization.ExchangeTurnTokenAsync(turnContext, "graph", exchangeScopes: scopes);
// use the token
}
}
Roep authorization.exchangeToken aan met de handlernaam en de scopes die u tijdens de beurt bepaalt.
connections__oboConnection__settings__clientId=
connections__oboConnection__settings__clientSecret=
connections__oboConnection__settings__tenantId=
connectionsMap__1__connection=oboConnection
connectionsMap__1__serviceUrl=obo
AgentApplication__UserAuthorization__Handlers__graph__Settings__azureBotOAuthConnectionName=teams_sso
AgentApplication__UserAuthorization__Handlers__graph__Settings__oboConnectionName=oboConnection
Uw agentcode zou er ongeveer als volgt uitzien:
class MyAgent extends AgentApplication {
constructor () {
super({ storage: new MemoryStorage() })
this.onActivity('message', this._onMessage, ['graph'])
}
private _onMessage = async (context, state) => {
const scopes = getScopes()
const exchangedToken = await this.authorization.exchangeToken(context, 'graph', { scopes })
// use exchangedToken.token
}
}
Roep auth.exchange_token aan met de scopes die u tijdens de beurt bepaalt en de handlernaam.
CONNECTIONS__MCS__SETTINGS__CLIENTID=
CONNECTIONS__MCS__SETTINGS__CLIENTSECRET=
CONNECTIONS__MCS__SETTINGS__TENANTID=
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__MCS__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=teams_sso
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__MCS__SETTINGS__OBOCONNECTIONNAME=MCS
Uw agentcode zou er ongeveer als volgt uitzien:
@AGENT_APP.message(re.compile(r".*"), auth_handlers=["MCS"])
async def on_message(context: TurnContext, state: TurnState) -> None:
scopes = get_scopes()
token_response = await AGENT_APP.auth.exchange_token(context, scopes, "MCS")
# use token_response.token
Regionale OAuth-instellingen
Voor regio's buiten de VS moet u het tokenservice-eindpunt bijwerken dat uw agent gebruikt.
Het volgende voorbeeld toont de .NET-configuratie. Voeg het toe aan appsettings.json:
"RestChannelServiceClientFactory": {
"TokenServiceEndpoint": "{{service-endpoint-uri}}"
}
Voor service-endpoint-url gebruikt u de juiste waarde uit de volgende tabel voor openbare-cloudbots, met gegevenslocatie in de opgegeven regio.
| URI | Regio |
|---|---|
https://europe.api.botframework.com |
Europa |
https://unitedstates.api.botframework.com |
Verenigde Staten |
https://india.api.botframework.com |
India |