我們今天來說一下authentication,authentication一直是一個復雜的問題。bot里的authentication也不簡單。我們先來看一個概念:Bot Framework Token Service,根據官方定義,這個token service主要是:
- Facilitating the use of the OAuth protocol with a wide variety of external services.
- Securely storing tokens for a particular bot, channel, conversation, and user.
- Acquiring user tokens
可以看到這個service會和外部的服務溝通,保存一些已經獲取的token,這樣下次再來申請token的時候Bot Framework Token Service可以返回已經保存的token。
我們以一個例子來看一下具體的做法:
假設用戶促發了一個操作,要完成這個操作需要我們的bot調用Graph API,而調用Graph API需要有調用的Token。
-
用戶促發了一個email請求操作
-
這個操作作為一個activity被發送給了Bot Framework channel service,后者把這個請求進一步發送給了我們的bot服務。
-
我們的bot service發現用戶的activity需要一個訪問Graph API的token,所以就問Token Service請求這個token
-
由于這是此用戶第一次發起這個請求,Bot Framework Token Service之前沒有保存過這用戶的token,所以它返回給我們bot說,沒有找到token。
-
bot會為了獲取token,需要用戶確認授權,所以bot創建了一個OAuthCard對象,并且含有GraphConnection的名字,并且把這個OAuthCard穿回Channel Service
-
Bot Framework Channel Service收到這么一個請求后,就會調用Bot Framework Token Service來獲取一個合法的OAuth登入網址。這個登入網址會被加入到OAuthCard對象
-
Bot Framework Channel Service將含有OAuth登入網址的OAuthCard對象發送回用戶,這個對象會有一個sign-in的按鈕。
-
用戶收到OAuthCard對象,點擊上面的登入按鈕,聊天客戶端會打開用戶登入的網頁,讓用戶登入。
-
在用戶登入授權后,外部的Identity Provider就會把token傳回給Bot Framework Token Service,Bot Framework Token Service則會安全地把token保存下來。
-
我們的bot收到token后就可以對Graph API發起請求了。
等到下一次如果我們bot又需要同一個用戶的token時,Bot Framework Token Service會從TokenStore里找到之前保存的token,如果token還沒有過期的話,就直接返回給bot了。
authentication實際上是一個十分龐大復雜的topic,有興趣的讀者還可以參考?這篇文檔