Microsoft Teams entegrasyonu
Sorgu taleplerini bir Teams kanalında duyurun ve onayları HMAC ile doğrulanan aksiyon ucu üzerinden bağlayın.
Güncelleme:
Teams entegrasyonunun iki yarısı vardır: Workflows (ya da eski connector) webhook’u ile kanala duyurular ve otomasyonunuzun (outgoing webhook ya da Power Automate akışı) onaylamak/reddetmek için çağırabileceği bir aksiyon ucu.
Duyurular
- Teams kanalınız için bir Workflows (Power Automate) webhook’u oluşturun
ve URL’sini kopyalayın.
*.powerplatform.comya da*.logic.azure.comüzerindeki bir URL Adaptive Card alır. Eski Office 365 connector URL’leri (*.webhook.office.com;outlook.office.comURL’si ise yalnızca o host’uQUERYPROXY_CHAT_WEBHOOK_ALLOWED_HOSTS’a ekledikten sonra) hâlâ MessageCard alır, ancak Microsoft Office 365 Connectors’ı emekliye ayırdı: emeklilik duyurusu (14 Nisan 2026 güncellemesi), bunların 18-22 Mayıs 2026 arasındaki yaygınlaştırmadan sonra artık çalışmadığını söylüyor. Bir Workflows URL’si kullanın. - QueryProxy’de ChatOps’u açın; webhook URL’sini yapıştırın ve bir HMAC
secret belirleyin (güçlü, rastgele bir dize — aşağıdaki aksiyon ucunda da
aynı secret kullanılır). İkisi de şifreli saklanır. İlk kurulum secret’sız
kaydedilemediği için bu adımı bir sistem yöneticisi yapar; sonrasında
webhook URL’sini ve açık/kapalı bayrağını takımın DBA’leri güncellemeye devam
eder. Webhook URL’si
https://olmalı ve host’u izin listesinde bulunmalıdır (varsayılan olarakhooks.slack.com,*.webhook.office.com,*.logic.azure.comve*.powerplatform.com; liste sohbet sağlayıcıları arasında ortaktır;QUERYPROXY_CHAT_WEBHOOK_ALLOWED_HOSTSile genişletin).
Kırıcı değişiklik — signing secret’ı yalnızca sistem yöneticisi belirleyebilir. DBA’ler webhook URL’sini ve enabled bayrağını yönetmeye devam eder ama secret’ı giremez ya da döndüremez; yönetici de mevcut bir secret’ı değiştirirken yürürlükteki secret’ı ispat etmek zorundadır. HMAC yalnızca “çağıran secret’ı biliyor” der, “şu kişi onayladı” demez — secret’ı kendi seçebilen bir DBA, kendi talebini bir meslektaşı adına onaylayıp denetim izine o kişinin adını yazdırabiliyordu. ChatOps’u zaten kurmuş kurulumlarda secret’ın yükseltmeden sonra bir kez döndürülmesi önerilir.
Aynı gerekçeyle entegrasyonu silmek de yalnızca sistem yöneticisinin işidir — yeniden kurmak için gereken secret’ı ancak bir yönetici girebiliyor. DBA’in gündelik, geri alınabilir kontrolü Enabled bayrağını kapatıp kaydetmektir.
Yeni talepler; talep sahibi, bağlantı, ifade sayısı, SQL önizlemesi ve
Review in QueryProxy bağlantısıyla bir kart olarak yayınlanır. Önizleme 400
karakterde kesilir ve varsayılan olarak metin ve sayı literallerini ? gösterir;
QUERYPROXY_CHAT_INCLUDE_SQL onu full ya da none yapar. Kararlar da
alındıkça kanala duyurulur.
Bir Workflows URL’sinde kart, bir olgu listesi (talep sahibi, bağlantı, ifadeler),
sabit genişlikli bir metin parçasındaki SQL önizlemesi (markdown olarak
ayrıştırılmaz, dolayısıyla a*b, c*d yazıldığı gibi gelir) ve bir Open URL
aksiyonu olan Adaptive Card 1.5’tir. Gövde, Workflows’un “post card” mesajıdır:
kart attachments[0].content içinde olmak üzere type: message.
Özel akışlar için kırıcı değişiklik. MessageCard alanlarını (
title,summary,sections[0].facts) okuyan,logic.azure.comURL’sindeki bir akış artık bunları boş okur. Adaptive Card’ıattachments[0].contentiçinden okuyun ya da gövdeyi olduğu gibi iletin.queryproxyzarfı değişmez ve üst düzeyde kalır.
Kart ayrıca, kanalda görünmeyen bir queryproxy zarfı taşır: otomasyonunuzun
aksiyon ucuna iletmesi gereken request_id ve action_token alanları buradadır.
MessageCard işleyicileri tanımadıkları üst düzey anahtarları yok saydığı için
token kanala serpilmez.
{
"queryproxy": { "request_id": 123, "action_token": "…" },
"type": "message",
"attachments": [{ "contentType": "application/vnd.microsoft.card.adaptive", "content": { "type": "AdaptiveCard", "version": "1.5" } }]
}
Eski bir connector URL’sinde aynı zarf "type": "MessageCard" yanında durur.
Aksiyon ucu
Teams tarafındaki otomasyondan onaylamak/reddetmek için şu çağrıyı yapın:
POST https://queryproxy-sunucunuz/webhooks/teams/actions
X-QueryProxy-Timestamp: <unix saniye>
Authorization: HMAC <base64(HMAC_SHA256("{timestamp}:{raw_body}", secret))>
Content-Type: application/json
{
"action": "approve",
"request_id": 123,
"actor_id": "<AAD object id>",
"token": "<kartın queryproxy.action_token değeri>",
"reason": "opsiyonel — reject için kullanılır"
}
action—approveya dareject.request_id— duyuru kartındaki talep numarası.actor_id— onaylayanın Azure AD object id’si. QueryProxy bunu, bir yöneticinin Teams & Users → Manage users ekranında belirlediği Teams ID eşlemesi üzerinden bir kullanıcıya çözer (eşlenmemiş bir id422ile reddedilir); asla beyan edilen bir e-posta ile çözülmez. Çözülen kullanıcı ayrıca entegrasyonun takımına üye olmalıdır (admin bu kontrolden her zaman geçer); değilse istek403ile geri çevrilir ve politikaya hiç ulaşmaz. Webdeki kurallar aynen geçerlidir: kullanıcının talebin takımında DBA rolü olmalı ve kendi talebine karar verememelidir. Webde olduğu gibi admin’ler bu iki kuralı da aşabilir; kuralı aşan bir admin onayı denetim günlüğünde işaretlenir.token— zorunlu. Kartınqueryproxyzarfındakiaction_tokendeğeri; o tek talebe bağlı, 24 saat ömürlü ve tek kullanımlıktır.reason—rejectiçin opsiyonel; varsayılanı “Rejected via Teams by <isim>”.approveiçin, onay bir yönetici override’ı olduğunda (onaylayan takımın DBA’si değil ya da kendi talebine karar veriyor) zorunludur: gerekçe (1 ile 1000 karakter) olmadan çağrı422ile reddedilir ve token harcanmaz. Gerekçe denetim günlüğüne kaydedilir.
Kırıcı değişiklik —
tokenalanı olmadan çağrı kabul edilmez. Aksiyon ucu bu sürümden itibaren her istekte geçerli bir aksiyon token’ı bekler; otomasyonlarınızı kartınqueryproxyzarfındakiaction_tokendeğerini iletecek şekilde güncelleyin. Bu sürümden önce yayınlanmış kartlarda böyle bir token yoktur — o talepleri web arayüzünden karara bağlayın. Token’ı olmayan, süresi dolmuş ya da harcanmış bir çağrı422ile ve bilerek belirsiz bir mesajla döner.
İmza "{timestamp}:{raw_body}" üzerinden hesaplanır (Slack
ile aynı zaman damgalı şema), base64 kodlu, Authorization: HMAC …
başlığında. Bir Power Automate akışı bu başlığı doğrudan hesaplayabilir.
HMAC anahtarı, saklandığı hâliyle secret’tır; secret geçerli bir base64 ise
QueryProxy onu çözer ve çözülmüş baytlarla imzalar (Teams outgoing webhook’larının
kullandığı kural). Salt alfanümerik dizgelerin çoğu geçerli base64’tür; bu
yüzden kendi tarafınızda çözülmüş baytlarla imzalayın — ya da secret’ın olduğu
gibi kullanılması için base64 alfabesi dışında bir karakter (- ya da !)
ekleyin.
Güvenlik
X-QueryProxy-Timestampbaşlığı zorunludur ve sunucu saatine göre ±5 dakika içinde olmalıdır; böylece yakalanan bir istek sonradan yeniden oynatılamaz.- Geçersiz ya da eksik HMAC (ya da eski/eksik zaman damgası)
401döner ve hiçbir şeyi değiştirmez. - Onaylayan Teams ID eşlemesiyle önceden bağlanmış ve entegrasyonun takımına üye (ya da admin) olmalıdır — paylaşılan secret tek başına rastgele bir kullanıcı adına işlem yapamaz.
- Tek kullanımlık aksiyon token’ı, çağrının QueryProxy’nin gerçekten yayınladığı bir kartı yanıtladığını gösterir ve yalnızca bir kez harcanabilir. Token, karar gerçekten kaydedildikten sonra yakılır; yetkilendirmeye takılan bir çağrı kartın tek hakkını harcamaz. HMAC tek başına yalnızca çağıranın paylaşılan secret’ı bildiğini kanıtlar, hangi kişinin işlem yaptığını değil; secret’ın yalnızca sistem yöneticisine ait olmasının nedeni de budur.
- Yanıtlar JSON’dur (
{"ok": true|false, "message": "…"}); yetkilendirme hataları gerekçesiyle403, geçersiz token ya da bağlanmamış kimlik422, bilinmeyen ya da başka takıma ait birrequest_idise404döner. - Uç, QueryProxy’deki her webhook gibi hız sınırlıdır.
Hatırlatmalar ve süresi dolmuş düğmeler
QUERYPROXY_PENDING_REMIND_AFTER saat (varsayılan 4) boyunca pending kalan
bir talep, kanal için ve portalda, yeni bir aksiyon token’ıyla bir hatırlatma
alır. Talepler asla zaman aşımına uğramaz. Süresi dolmuş bir token taşıyan karar
çağrısı, aksiyonun süresinin dolduğunu söyleyerek yanıt verir ve daha yeni mesaja
işaret eder.
Slack’teki gibi tam etkileşimli Adaptive Card düğmeleri bir Teams bot kaydı gerektirir ve yol haritasındadır; bugün Teams’ten onay akışını aksiyon ucu karşılar.