我是微軟Dynamcis 365 & Power Platform方面的工程師羅勇,也是2015年7月到2018年6月連續三年Dynamics CRM/Business Solutions方面的微軟最有價值專家(Microsoft MVP),歡迎關注我的微信公眾號 MSFTDynamics365erLuoYong ,回復341或者20190603可方便獲取本文,同時可以在第一間得到我發布的最新博文信息,follow me!
Dynamics 365支持OAuth認證,我前面已經寫過幾篇文章了,這次我將 利用Fiddler模擬通過Dynamics 365的OAuth 2 Client Credentials認證后調用Web API 文章的方法用Microsoft Flow來實現。
登錄 https://flow.microsoft.com 后,點擊左邊的 【My flows】 導航項,再點擊右邊的 【New】 > 【Scheduled - from blank】。

在出來的窗口中為Flow設置好名稱,我這里設置為Repeat every 50 Minute,也就是每隔50分鍾運行一次,因為獲取到的Access Token默認有效期是1個小時。然后點擊【Create】按鈕。

在界面點擊【+ New step】按鈕。

我這里輸入 HTTP來篩選,在篩選結果中選擇第一個HTTP。

我這里設置該請求的屬性如下,請求的URI和內容的說明,返回內容說明請參考我的博文:利用Fiddler模擬通過Dynamics 365的OAuth 2 Client Credentials認證后調用Web API 。

一般應該為步驟起個合適的名字,方法是點擊步驟旁邊的更多命令圖標,點擊 【Rename】,我這里更新為【Get Dynamics 365 Access Token】,這個名字后面的步驟中我會用到。


我這里將獲取到的access token存入實體 Access Token的Name為 LuoYong_Demo_App 的記錄中。首先我需要查出這條記錄,然后更新它。
我繼續添加一個步驟,使用Common Data Service進行篩選,選擇 【List records】這種步驟。

我設置 Environment為 (Current) ,這個方便進行不同環境之前遷移,記得自己在新建Microsoft Flow的時候選擇好合適的Environment。Enity Name選擇合適的,然后點擊【Show advanced options】

查詢記錄當然需要設置查詢條件,也就是OData語法,設置到【Filter Query】這個字段旁,我這里設置的是 new_name eq 'LuoYong_Demo_App' ,Top Count我這里設置為1,因為我只需要找到符合記錄的第一條即可,然后我將這個步驟重命名為【Get Access Token Records】。

然后再新增一個Common Data Service類別下面的【Update a record】步驟。

Environment還是設置為 (Current),Entity Name設置為要更新的實體,Record identifier就是要更新記錄的主鍵(Guid),這個值應該是前面步驟【Get Access Token Records】 查詢到的記錄集中的第一條記錄的new_accesstokenid字段的值,這里利用表達式來設置,點擊字段值后,在右邊的彈出框中切換到 Expression,輸入 body('Get_Access_Token_Records')['value'][0]['new_accesstokenid'] 然后點擊OK按鈕。

再點擊【Show advanced options】按鈕設置要更新字段的值,以類似的方法設置設置Access Token字段的值為表達式: body('Get_Dynamics_365_Access_Token')['access_token'] ,

繼續以類似方法為【Valid To Datetime】字段值設置為表達式 addHours(utcNow(),1) 。

設置好了以后這個步驟的設置如下:

然后點擊【Save】按鈕保存該Microsoft Flow,最后這個Flow如下:

然后我們來測試下,點擊【Test】。

選擇【I'll perform the trigger action】,然后點擊【Save & Test】。

在彈出窗口中點擊【Run flow】按鈕。

在提示成功框中點擊【See flow run activity】查看運行記錄。

運行報錯:

是獲取access token步驟報錯,報錯信息如下:
{"error":"invalid_request","error_description":"AADSTS900144: The request body must contain the following parameter: 'grant_type'.\r\nTrace ID: ccb315ef-4fbb-4c3b-ad40-825dfd7c4a00\r\nCorrelation ID: 8cce0977-0d45-43cb-a0ba-9b911bd949e1\r\nTimestamp: 2019-06-03 11:07:29Z","error_codes":[900144],"timestamp":"2019-06-03 11:07:29Z","trace_id":"ccb315ef-4fbb-4c3b-ad40-825dfd7c4a00","correlation_id":"8cce0977-0d45-43cb-a0ba-9b911bd949e1"}
怎么辦?可以看到請求的內容和返回,我發現是請求時候,默認請求的Content-Type是application/json,但實際上我這個請求並不是,所以需要自己賦值來覆蓋默認值。
修改下這個步驟添加一個名稱為Content-Type的Header,其值為 application/x-www-form-urlencoded 。

然后運行,成功。

然后我去Dynamics 365中看下:

當然我也驗證了這個access token是否有效,是有效的。

你可能還會問,如果我不通過這種方式,可以直接發起HTTP請求,自帶驗證方式來直接調用Dynamics 365 Customer Engagement的Web API嗎?答案是可以的,我這么設置,注意【Authentication】選擇【Active Directory OAuth】,然后設置相應字段的值類似如下。

