關於bot framework (6) - 如何分辨WebChat用戶並保護Secret key

好不容易透過bot framework建立好了一個bot,要讓用戶和我們的bot chatting,最簡單的方式當然就是透過內建的Web Chat。

你會發現,在後台的管理畫面上,有一個內建的Weh Chat:

要啟動該Web Chat,只需要點選上圖中的Edit,並且產生一個secret key即可:

有了這組secret key,你可以直接透過底下這樣的網址,讓不特定用戶來與你建立好的bot聊天:
https://webchat.botframework.com/embed/test20160826?s=x4fT4xmsjNw.cwA.lLc.MfO35JmnXsxKxihkLaMptAlwTqGwOJFP1kLim174nFh8

畫面大致如下,這個Web Chat UI除了可以文字聊天,還可以上傳圖片,其實蠻好用的:

但問題來了,文件上開宗明義地就說,這組secret如果洩漏出去了,那任何人都可以用iframe指令把你的bot embbed在他們家的網頁裡,這或許你不在意,但還有另一個問題。每一個得知這樣的網址連進來的用戶,對談時都是以匿名的方式進來的,如果將來要查詢聊天紀錄,很不方便。

那麼除了用Skype或是FB Messanger來串這個bot,有沒有什麼方式可以解決這個問題呢? 有的,而且還一石二鳥。

首先,你確實不應該用後台產生的這組secret key作為使用WebChat UI的參數,而是該改用一個token。本來的WebChat網址

https://webchat.botframework.com/embed/botName?s=x4fT4xmsjNw.cwA.lLc.MfO35JmnXsxKxihkLaMptAlwTqGwOJFP1kLim174nFh8

應該改為

https://webchat.botframework.com/embed/botName?t=token

這樣的型式。

那這token怎麼來呢,你可以透過底下這個API取得:
https://webchat.botframework.com/api/conversations

當你用POST呼叫上面這組API,在headers中傳入Authorization(value是BotConnector 加上你的secret key),就可以啟用一個新的Conversation,並透過回傳的JSON取得該Conversation的ID與Token,如下圖 postman畫面:

這Conversation的ID與Token能幹啥? 告訴你,大有用途。

首先,你取得token之後,就可以把剛才連結WebChat的網址改成https://webchat.botframework.com/embed/botName?t=token

這樣你就不會洩漏你的bot的secret key了,而每一組token都是有時間限制的,逾時之後就無法使用了。

另外一個很重要的資訊是ConversationID,有了ConversationID我們就可以在用戶從WehChat的UI與bot對談時,從後端WebAPI程式碼當中,分辨出當前對談的人是誰,而不需要用戶非得從skype或FB Messanger進來,才能得知用戶的身分了。這…怎麼說呢?

首先上面這組POST指令,是可以(也應該要)從後端呼叫的,拿asp.net WebForm/MVC來說,你的流程可以是:
  1. 讓用戶先用Forms驗證登入
  2. 透過User.Identity.Name取得用戶的身分(假設用戶登入為David)
  3. 從後端asp.net C#程式碼中呼叫上面的API https://webchat.botframework.com/api/conversations ,來建立新的Conversation
  4. 取得該Conversation的ID與Token
    (一旦取得ConversationID﹐我們就可以記錄該 ConversationId 的對談對象是 David)
  5. 接著,利用剛才取得的token產生一個WebChat對談URL(https://webchat.botframework.com/embed/botName?t=token ),並redirect過去。
  6. 用戶即可在上面 https://webchat.botframework.com/embed/botName?t=token 這個位置與bot對談,對談中我們的後台bot對談邏輯WebApi中取得的activity.Conversation.Id ,就是剛才我們記錄下來的ConversationID,如此一來,就可以關連到用戶是David了。
瞭解了嗎? 透過上面這個POST API,不僅僅可以保護你的secret key,還可以取得新建立的對談的ConversationID,並且關連到與該bot對談的用戶,功能可說是非常大呢~

留言

這個網誌中的熱門文章

使用 Airtable 在小型需求上取代傳統資料庫

在POC或迷你專案中使用 LiteDB

專業的價值...

精彩(且驚人)的Semantic Kernel入門範例

周末讀書會 - 一如既往