หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
เอเจนต์ใช้ OAuth เพื่อลงชื่อเข้าใช้ให้ผู้ใช้และรับโทเค็นสําหรับทรัพยากรขั้นปลาย (เช่น Microsoft Graph) โดยไม่ต้องจัดการข้อมูลประจําตัวเอง บริการ Azure Bot จัดการการแลกเปลี่ยนโทเค็น และเอเจนต์จะดึงโทเค็นผู้ใช้ที่เป็นผลลัพธ์ในระหว่างรอบ
ภาพรวม
การใช้ OAuth ในเอเจนต์เกี่ยวข้องกับกิจกรรมสามอย่าง:
- กําหนดค่า OAuth ใน Azure Bot และการลงทะเบียนแอป: สร้างการเชื่อมต่อ OAuth อย่างน้อยหนึ่งรายการในทรัพยากร Azure Bot ของคุณ โดยแต่ละรายการได้รับการสนับสนุนโดยการลงทะเบียนแอป Microsoft Entra ID เพิ่มการอนุญาตของผู้ใช้โดยใช้ข้อมูลประจําตัวที่ติดต่อกับภายนอกครอบคลุมวิธีการที่พบบ่อยที่สุด ข้อมูลประจําตัวประเภทอื่นๆ เช่น ข้อมูลลับไคลเอ็นต์หรือใบรับรองก็ได้รับการสนับสนุนเช่นกัน สําหรับชุดตัวเลือกทั้งหมด โปรดดู ข้อมูลพื้นฐานการรับรองความถูกต้องของบริการบอท
- กําหนดค่าการตั้งค่าที่ตรงกันในเอเจนต์: การเชื่อมต่อ OAuth แต่ละรายการในบอท Azure แมปกับตัวจัดการ OAuth หนึ่งตัวในการกําหนดค่าของเอเจนต์ โปรดดู การตั้งค่า สําหรับการตั้งค่าเอเจนต์ทั่วไป โปรดดู SDK เอเจนต์สำหรับ Microsoft 365 คืออะไร
- ใช้โทเค็นในโค้ด: ในระหว่างรอบ ให้ดึงโทเค็นผู้ใช้ หรือทําการแลกเปลี่ยนในนามของ (OBO) ผ่าน API การอนุญาตผู้ใช้ของเอเจนต์ ดู ใช้โทเค็นในโค้ด (ไม่ใช่ OBO) และ ใช้โทเค็นในโค้ด (OBO)
โปรดคํานึงถึงแนวคิดต่อไปนี้ในขณะที่คุณอ่านส่วนที่เหลือของบทความนี้:
- บอท Azure สามารถมีการเชื่อมต่อ OAuth ได้หลายรายการ ตัวอย่างเช่น การเชื่อมต่อหนึ่งรายการสําหรับ Microsoft Graph และอีกการเชื่อมต่อสําหรับ GitHub การเชื่อมต่อแต่ละรายการได้รับการกําหนดค่าอย่างอิสระในบอท Azure
- มีความสัมพันธ์แบบ 1:1 ระหว่างการเชื่อมต่อ OAuth ในบอท Azure และตัวจัดการ OAuth ในเอเจนต์ การตั้งค่า
AzureBotOAuthConnectionNameของตัวจัดการจะตั้งชื่อการเชื่อมต่อบอท Azure ที่ใช้ หากต้องการใช้การเชื่อมต่อสองตัว ให้กําหนดตัวจัดการสองตัว - API การอนุญาตผู้ใช้ของเอเจนต์เป็นพื้นที่ที่คุณเรียกใช้ในโค้ด ใน .NET นี่คือ
AgentApplication.UserAuthorization—ตัวอย่างเช่นGetTurnTokenAsyncเพื่ออ่านโทเค็นและExchangeTurnTokenAsyncเพื่อทําการแลกเปลี่ยน OBO พื้นที่ที่เทียบเท่าเป็นauthorizationใน JavaScript และauthใน Python
สําหรับตัวอย่างการทํางาน โปรดดูตัวอย่างการลงชื่อเข้าใช้อัตโนมัติและ OBO สําหรับ:
การรองรับภาษาสำหรับ OAuth
SDK เอเจนต์รองรับ OAuth สําหรับ .NET, JavaScript และ Python แนวคิดหลักจะเหมือนกันในทุกภาษา: ตัวจัดการ OAuth, การแนบตัวจัดการกับเส้นทาง และการแลกเปลี่ยน OBO เฉพาะรูปแบบการกําหนดค่าและชื่อ API ตัวจัดการเท่านั้นที่ต่างกัน:
| Language | ตําแหน่งที่คุณกําหนดค่า | พื้นที่ API |
|---|---|---|
| .NET |
appsettings.json (หรือโค้ดใน Program.cs) |
AgentApplication.UserAuthorization |
| JavaScript | ตัวแปรสภาพแวดล้อม .env |
AgentApplication.authorization |
| Python | ตัวแปรสภาพแวดล้อม .env |
AgentApplication.auth |
สําหรับ JavaScript และ Python คีย์ .env จะใช้ชื่อลําดับชั้นเดียวกันกับโครงสร้าง .NET appsettings.json โดยแต่ละระดับคั่นด้วยขีดล่างคู่ (__) คีย์ JavaScript จะเก็บชื่อปลายสุดแบบ camel ที่แสดงในตาราง (ตัวอย่างเช่น azureBotOAuthConnectionName) คีย์ Python เป็นตัวพิมพ์ใหญ่ (ตัวอย่างเช่น AZUREBOTOAUTHCONNECTIONNAME)
สำคัญ
การลงชื่อเข้าใช้อัตโนมัติส่วนกลาง (AutoSignIn) และ DefaultHandlerName ได้รับการสนับสนุนเฉพาะใน .NET เท่านั้น ใน JavaScript และ Python คุณจะแนบตัวจัดการ OAuth กับเส้นทางที่เฉพาะเจาะจง ดังที่แสดงใน การกําหนดค่าต่อเส้นทาง
การตั้งค่า
อ็อบเจกต์การอนุญาตผู้ใช้ภายใน AgentApplication จะควบคุมวิธีที่เอเจนต์รับโทเค็นผู้ใช้ อย่างน้อยที่สุด ตัวจัดการแต่ละตัวจะตั้งชื่อการเชื่อมต่อ OAuth ของบอท Azure ที่ใช้ ตัวอย่างต่อไปนี้แสดงโครงสร้างขั้นต่ำในแต่ละภาษา ตาราง ที่ตามมาจะอธิบายคุณสมบัติที่เหลือที่พร้อมใช้งาน และ ส่วน OBO ครอบคลุมการตั้งค่า OBOConnectionName และ OBOScopes
ใน .NET ให้กําหนดค่าการอนุญาตผู้ใช้ภายใต้ AgentApplication ใน appsettings.json:
"AgentApplication": {
"UserAuthorization": {
"DefaultHandlerName": "{{handler-name}}",
"AutoSignIn": true | false,
"Handlers": {
"{{handler-name}}": {
"Settings": {
"AzureBotOAuthConnectionName": "{{azure-bot-connection-name}}"
}
}
}
}
}
ใน JavaScript ให้กําหนดค่าการอนุญาตผู้ใช้ด้วยตัวแปรสภาพแวดล้อมในไฟล์ .env:
# 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}}
ใน Python ให้กําหนดค่าการอนุญาตผู้ใช้ด้วยตัวแปรสภาพแวดล้อมในไฟล์ .env:
# 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
ตารางต่อไปนี้แสดงรายการคุณสมบัติ UserAuthorization ระดับบนสุดที่กำหนดวิธีการเลือกตัวจัดการและวิธีการรับโทเค็นสำหรับแต่ละกิจกรรมขาเข้า
| คุณสมบัติ | จำเป็นต้องระบุ | ชนิด | คำอธิบาย |
|---|---|---|---|
DefaultHandlerName |
ไม่ (แนะนำ) | สตริง | .NET เท่านั้น ชื่อของตัวจัดการที่ใช้เมื่อ AutoSignIn ประเมินเป็นจริงและไม่มีการแทนที่ตามเส้นทางถูกระบุ |
AutoSignIn |
ไม่ | bool หรือ delegate | .NET เท่านั้น เมื่อเป็นจริง (ค่าเริ่มต้น) เอเจนต์จะพยายามรับโทเค็นสำหรับทุกกิจกรรมที่เข้ามา แทนที่ในขณะรันไทม์ด้วย Options.AutoSignIn เพื่อกรองประเภทกิจกรรม |
Handlers |
ใช่ (อย่างน้อยหนึ่งรายการ) | อ็อบเจ็กต์ (พจนานุกรม) | การแมปชื่อตัวจัดการกับการกำหนดค่า แต่ละคีย์ต้องไม่ซ้ำกัน |
ใน .NET หากต้องการจำกัดกิจกรรมที่ใช้การลงชื่อเข้าใช้อัตโนมัติ ให้ตั้งค่าเพรดิเคตที่คล้ายกับ Options.AutoSignIn = (context, ct) => Task.FromResult(context.Activity.IsType(ActivityTypes.Message)); JavaScript และ Python ไม่รองรับการลงชื่อเข้าใช้อัตโนมัติส่วนกลาง ให้ลงชื่อเข้าใช้แบบขอบเขตแทน โดยแนบชื่อตัวจัดการเฉพาะกับแต่ละเส้นทาง ดังที่แสดงในตัวอย่างต่อเส้นทาง
คุณสมบัติของการตั้งค่า
ตารางต่อไปนี้อธิบายออบเจ็กต์ Settings แบบซ้อนกันที่ใช้กับตัวจัดการ OAuth แต่ละตัว เพื่อควบคุมการแสดงการ์ดลงชื่อเข้าใช้, ลักษณะการทำงานของการลองใหม่, การหมดเวลา, และการกำหนดค่าการแลกเปลี่ยน OBO แบบเลือกได้
| คุณสมบัติ | จำเป็นต้องระบุ | ชนิด | คำอธิบาย |
|---|---|---|---|
AzureBotOAuthConnectionName |
ใช่ | สตริง | ชื่อการเชื่อมต่อ OAuth ที่กำหนดไว้ในทรัพยากร Azure Bot |
OBOConnectionName |
ไม่ (เฉพาะ OBO) | สตริง | ชื่อของการเชื่อมต่อ Agents SDK ที่ใช้ในการดำเนินการแลกเปลี่ยนโทเค็นแบบ OBO (ในนามของผู้ใช้) |
OBOScopes |
ไม่ (เฉพาะ OBO) | string[] | ขอบเขตที่ร้องขอระหว่างการแลกเปลี่ยน OBO หากละเว้นด้วย OBOConnectionName คุณสามารถเรียก ExchangeTurnTokenAsync ได้ด้วยตนเอง |
Title |
ไม่ | สตริง | ชื่อการ์ดลงชื่อเข้าใช้แบบกําหนดเอง กำหนดค่าเริ่มต้นเป็น ลงชื่อเข้าใช้ |
Text |
ไม่ | สตริง | ข้อความปุ่มการ์ดลงชื่อเข้าใช้ ค่าเริ่มต้นเป็น โปรดลงชื่อเข้าใช้ |
InvalidSignInRetryMax |
ไม่ | int | จำนวนครั้งที่สามารถลองใหม่ได้สูงสุดเมื่อผู้ใช้กรอกรหัสผิด ค่าเริ่มต้นเป็น 2 |
InvalidSignInRetryMessage |
ไม่ | สตริง | ข้อความแสดงหลังจากป้อนรหัสไม่ถูกต้อง ค่าเริ่มต้นคือ รหัสลงชื่อเข้าใช้ไม่ถูกต้อง โปรดกรอกรหัส 6 หลัก |
Timeout |
ไม่ | int (มิลลิวินาที) | จำนวนมิลลิวินาทีก่อนที่ความพยายามลงชื่อเข้าใช้ที่กำลังดำเนินการจะหมดอายุ ค่าเริ่มต้นคือ 900000 (15 นาที) |
หมายเหตุ
AzureBotOAuthConnectionName, OBOConnectionName, OBOScopes, Title และ Text นําไปใช้กับทั้งสามภาษา (โดยใช้ตัวพิมพ์ของคีย์ต่อภาษาที่อธิบายไว้ใน การรองรับภาษาสำหรับ OAuth)
InvalidSignInRetryMax, InvalidSignInRetryMessage และ Timeout เป็นการตั้งค่า .NET
คุณควรใช้ประเภทใด
ใช้ตารางต่อไปนี้เพื่อตัดสินใจว่าแนวทางใดที่เหมาะกับสถานการณ์ของคุณ
| ชุดตัวเลือก | ใช้เมื่อ |
|---|---|
| ลงชื่อเข้าใช้อัตโนมัติ (.NET เท่านั้น) | คุณต้องการให้ทุกกิจกรรมที่เข้ามาได้รับโทเค็นโดยอัตโนมัติ หรือคุณต้องการชุดย่อยที่กรองแล้ว (ตัวอย่างเช่น เฉพาะข้อความหรือทุกอย่างยกเว้นเหตุการณ์) โดยการระบุเพรดิเคตให้กับ UserAuthorizationOptions.AutoSignIn รองรับเฉพาะใน .NET |
| ต่อเส้นทาง | เฉพาะตัวจัดการเส้นทางบางตัวเท่านั้นที่ต้องใช้โทเค็น หรือเส้นทางที่แตกต่างกันต้องใช้การเชื่อมต่อ OAuth ที่แตกต่างกัน (และโทเค็นที่แตกต่างกันด้วย) ตัวเลือกนี้เป็นตัวเลือกเดียวใน JavaScript และ Python ใน .NET เป็นส่วนเสริมการลงชื่อเข้าใช้อัตโนมัติส่วนกลาง หากเปิดใช้งานทั้งสองแบบใน .NET รอบจะสามารถเข้าถึงโทเค็นจากทั้งสองแหล่งได้ |
ใช้โทเค็นในโค้ด (ไม่ใช่ OBO)
ส่วนนี้แสดงวิธีการดึงและใช้โทเค็นผู้ใช้ที่ส่งคืนโดยตรงโดยการเชื่อมต่อ Azure Bot OAuth ของคุณโดยไม่ต้องทําการแลกเปลี่ยนในนามของผู้ใช้ ใน .NET คุณสามารถใช้การลงชื่อเข้าใช้อัตโนมัติส่วนกลางหรือตัวจัดการต่อเส้นทาง JavaScript และ Python ใช้ตัวจัดการต่อเส้นทางเท่านั้น ภายในตัวจัดการกิจกรรมของคุณ ให้ดึงโทเค็น (GetTurnTokenAsync ใน .NET, authorization.getToken ใน JavaScript, auth.get_token ใน Python) ให้ช้าที่สุด เพื่อให้ SDK สามารถรีเฟรชโทเค็นได้หากใกล้หมดอายุ ตัวอย่างต่อไปนี้อธิบายทั้งสองรูปแบบ
ลงชื่อเข้าใช้อัตโนมัติ (.NET เท่านั้น)
หมายเหตุ
การลงชื่อเข้าใช้อัตโนมัติส่วนกลางและ DefaultHandlerName มีอยู่ใน .NET เท่านั้น สําหรับ JavaScript และ Python ให้ใช้ การกําหนดค่าต่อเส้นทาง
ใช้การกำหนดค่านี้เมื่อการลงชื่อเข้าใช้อัตโนมัติส่วนกลางควรได้รับโทเค็นสำหรับทุกกิจกรรมขาเข้า โดยไม่จำเป็นต้องระบุตัวจัดการต่อเส้นทาง
"AgentApplication": {
"UserAuthorization": {
"DefaultHandlerName": "auto",
"Handlers": {
"auto": {
"Settings": {
"AzureBotOAuthConnectionName": "teams_sso",
}
}
}
}
},
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
public class MyAgent : AgentApplication
{
[MessageRoute]
public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
var token = await UserAuthorization.GetTurnTokenAsync(turnContext);
// use the token
}
}
การกำหนดค่าต่อเส้นทาง
ใช้การกำหนดค่าต่อเส้นทางเมื่อคุณต้องการการควบคุมแบบละเอียด: เฉพาะเส้นทางที่คุณทำเครื่องหมายอย่างชัดเจนเท่านั้นที่จะได้รับโทเค็น การกําหนดค่าต่อเส้นทางมีข้อดีดังต่อไปนี้:
- ช่วยลดการดึงโทเค็นที่ไม่จําเป็น
- อนุญาตให้เส้นทางต่างๆ กําหนดเป้าหมายการเชื่อมต่อ OAuth ที่แตกต่างกัน (และทรัพยากรหรือขอบเขตที่แตกต่างกัน)
- ช่วยให้คุณผสมเส้นทางที่รับรองความถูกต้องและไม่ได้รับการรับรองความถูกต้องภายในเอเจนต์เดียวกันได้
ในตัวอย่างต่อไปนี้ ตัวจัดการ graph เดียวจะถูกแนบกับเส้นทางข้อความเท่านั้น
ใน .NET การลงชื่อเข้าใช้อัตโนมัติส่วนกลางถูกปิดใช้งาน และตัวจัดการ graph ถูกแนบไปกับเส้นทางโดยใช้ autoSignInHandlers
"AgentApplication": {
"UserAuthorization": {
"AutoSignIn": false,
"Handlers": {
"graph": {
"Settings": {
"AzureBotOAuthConnectionName": "teams_sso",
}
}
}
}
},
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
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
}
}
ใน JavaScript ให้ส่งอาร์เรย์ของชื่อตัวจัดการเป็นอาร์กิวเมนต์สุดท้ายไปยังการลงทะเบียนเส้นทาง เฉพาะเส้นทางนั้นเท่านั้นที่ทริกเกอร์การลงชื่อเข้าใช้สำหรับตัวจัดการ graph
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
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
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
}
}
ใน Python ให้ส่งผ่าน auth_handlers ไปยังตัวปรับเส้นทาง เฉพาะเส้นทางนั้นเท่านั้นที่ทริกเกอร์การลงชื่อเข้าใช้สำหรับตัวจัดการ GRAPH
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=teams_sso
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
@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
ดึงโทเค็นระหว่างรอบ
ดึงโทเค็นผู้ใช้ทุกครั้งที่คุณต้องการในระหว่างรอบ คุณสามารถเรียกใช้ได้หลายครั้ง เรียกใช้ทันทีก่อนใช้งาน เพื่อให้ตรรกะการรีเฟรช (หากจำเป็น) ได้รับการจัดการอย่างโปร่งใส
| Language | โทร |
|---|---|
| .NET |
GetTurnTokenAsync(turnContext, handlerName) |
| JavaScript | authorization.getToken(context, handlerName) |
| Python | auth.get_token(context, handler_name) |
ใช้โทเค็นในโค้ด (OBO)
ในนามของผู้ใช้ (OBO) ขึ้นอยู่กับการลงชื่อเข้าใช้ของผู้ใช้ครั้งแรกที่ส่งคืนโทเค็นที่แลกเปลี่ยนได้ ซึ่งกำหนดให้ขอบเขตของการเชื่อมต่อ OAuth จะต้องรวมขอบเขตที่สอดคล้องหรือเทียบเท่ากับขอบเขตที่เปิดเผยโดย API ขั้นปลาย (ตัวอย่างเช่น หากขอบเขตที่เปิดเผยคือ defaultScopes ขอบเขตที่กำหนดอาจเป็น api://botid-{{clientId}}/defaultScopes) จากนั้น Agents SDK จะดำเนินการแลกเปลี่ยนผ่าน Microsoft Authentication Library (MSAL) โดยใช้การเชื่อมต่อที่กำหนดค่าซึ่งระบุโดย OBOConnectionName และรายการของ OBOScopes เมื่อทั้ง OBOConnectionName และ OBOScopes มีอยู่ในการกำหนดค่า การแลกเปลี่ยนจะเกิดขึ้นโดยอัตโนมัติ และคุณจะได้รับโทเค็นสุดท้ายผ่านการเรียกใช้โทเค็นมาตรฐาน (GetTurnTokenAsync / getToken / get_token) หากไม่มีอย่างใดอย่างหนึ่ง คุณสามารถดำเนินการแลกเปลี่ยนได้โดยตรงในรันไทม์ (ExchangeTurnTokenAsync ใน .NET, authorization.exchangeToken ใน JavaScript, auth.exchange_token ใน Python) ซึ่งช่วยให้คุณสามารถแก้ไขรายการการเชื่อมต่อหรือขอบเขตแบบไดนามิกได้
OBO ในการกําหนดค่า
ใช้รูปแบบนี้เมื่อคุณทราบทรัพยากรขั้นปลายและขอบเขตที่ต้องการขณะกำหนดค่า เมื่อคุณระบุทั้ง OBOConnectionName และ OBOScopes SDK จะดำเนินการแลกเปลี่ยนในนามผู้ใช้โดยอัตโนมัติในระหว่างการลงชื่อเข้าใช้ ซึ่งหมายความว่าในการเรียกใช้ตัวรับโทเค็นมาตรฐานในภายหลังจะส่งคืนโทเค็น OBO โดยตรงโดยไม่ต้องใช้โค้ดรันไทม์เพิ่มเติม
"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"
]
}
}
},
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
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
}
}
ใน JavaScript กําหนดการเชื่อมต่อ OBO ในแผนที่การเชื่อมต่อและอ้างอิงจากตัวจัดการด้วย oboConnectionName และ 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
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
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
}
}
ใน Python ให้กําหนดการเชื่อมต่อ OBO ภายใต้ CONNECTIONS และอ้างอิงจากตัวจัดการด้วย OBOCONNECTIONNAME และ 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
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
@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 ที่รันไทม์
ใช้การแลกเปลี่ยนรันไทม์เมื่อคุณไม่สามารถแก้ไขทรัพยากรขั้นปลาย ขอบเขต หรือการเชื่อมต่อในการกําหนดค่า สถานการณ์นี้เกิดขึ้น ตัวอย่างเช่น เมื่อขอบเขตขึ้นอยู่กับผู้เช่า บทบาทของผู้ใช้ หรือค่าสถานะคุณลักษณะ ในโมเดลนี้ คุณเลือกกําหนดค่าการเชื่อมต่อ OBO จากนั้นเรียกใช้วิธีการแลกเปลี่ยนด้วยขอบเขตที่คุณตัดสินใจในเวลาของรอบ คุณจะได้รับโทเค็นที่แลกเปลี่ยนซึ่งคุณสามารถนําไปใช้ได้ทันที
เรียกใช้ ExchangeTurnTokenAsync ด้วยขอบเขตที่คุณตัดสินใจในเวลาของรอบ
"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"
]
}
}
},
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
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
}
}
เรียกใช้ authorization.exchangeToken ด้วยชื่อตัวจัดการและขอบเขตที่คุณตัดสินใจในเวลาของรอบ
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
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
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
}
}
เรียกใช้ auth.exchange_token ด้วยขอบเขตที่คุณตัดสินใจในเวลาของรอบและชื่อตัวจัดการ
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
โค้ดเอเจนต์ของคุณจะมีลักษณะดังนี้:
@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
การตั้งค่า OAuth ระดับภูมิภาค
สำหรับภูมิภาคที่ไม่ใช่สหรัฐอเมริกา ให้อัปเดตจุดเชื่อมต่อบริการโทเค็นที่เอเจนต์ของคุณใช้
ตัวอย่างต่อไปนี้แสดงการกำหนดค่า .NET เพิ่มลงใน appsettings.json:
"RestChannelServiceClientFactory": {
"TokenServiceEndpoint": "{{service-endpoint-uri}}"
}
สำหรับ service-endpoint-url ให้ใช้ค่าที่เหมาะสมจากตารางต่อไปนี้สำหรับบอทระบบคลาวด์สาธารณะที่มีถิ่นที่อยู่ของข้อมูลในภูมิภาคที่ระบุ
| URI | ภูมิภาค |
|---|---|
https://europe.api.botframework.com |
ยุโรป |
https://unitedstates.api.botframework.com |
ประเทศสหรัฐอเมริกา |
https://india.api.botframework.com |
อินเดีย |