關注本人微信和易信公眾號: 微軟動態CRM專家羅勇 ,回復233或者20161104可方便獲取本文,同時可以在第一間得到我發布的最新的博文信息,follow me!我的網站是 www.luoyong.me 。
不是在Web資源中調用Web API怎么進行認證呢?如果不認證就會返回 HTTP/1.1 401 Unauthorized ,反正我的IFD環境是這樣。有時候真的想用Fiddler等工具來模擬調用看看效果,然后再寫代碼?怎么辦?我這里提供一個不是很聰明的辦法,那就是通過OAuth認證后拿到access token,帶上這個token來調用Web API就沒問題了。首先你的環境要做面向Internet的部署,也就是IFD,可以參考我的好幾篇文章:
Dynamics CRM 2013 IFD部署之一 ,然后還需要配置OAuth 2.0,可以參考我的這篇文章
Dynamics CRM 2 配置 OAuth 2.0 。其余的就是本文要講解的內容了。可以通過PowerShell命令 Get-AdfsClient 來獲取配置的ClientId 值為ba106265-fb3b-49e0-a0e8-6840b3d71ac2和 RedirectUri 值為http://localhost/callback ,如下所示,這兩個參數后面會用到的。

注意這個URL中的前面部分是你的STS服務器的URL,我這里監控的是444端口,client_id換成前面的ClientId參數值,redirect_uri換成前面獲取的RedirectUri參數值,resource參數是你訪問的CRM的URL。打開的頁面如下:

輸入用戶名和密碼,點擊登錄后界面如下:

出錯是因為我讓它跳轉的頁面是localhost,我這里沒有這個給他訪問,這是我之前做得CRM混合移動App的Client,執行OAuth認證后需要跳轉到本地。關鍵的是URL,URL值如下:
可以看到URL中有個code參數,這個參數就是OAuth認證中的authorization code,需要拿這個authorization code來換取access token。然乎我使用Fiddler來做一個POST請求,POST的URL是
https://sts.luoyong.me:444/adfs/oauth2/token ,Request Body的內容是:
grant_type=authorization_code&code=CU1uSwt_n06291OeFrRuWg.myb1WpoE1AgDAF8t1cL752tMQLE.IATP5vl8HO_sdv8OMs0bPACQSXLPb11zMN48-tmSRwkZ9xOy7uoWLBk0652_1v_aIqxuhngQS6zuxaaMRCJ-ppi663TnBhK7LYe-N3jwRcLlDy8fYYDO4eSMKhAo3wNRKiTH4JlGuubMGbB1lHSmU4Ku_Hx4SQnUwj9-XIrgvorWJbVzvqiZjXfZd6UulPJO9x4WuO1aLJzC7wPhlhvu9v8bMu3iSFiPKhg3hegiZFVlPsmXuaXC4vVpFSFv3Fd9Y-JnUVP2DkIU6elZjKA0aNxLj97ecgn7ZdnzFP9JPW0DA7lSRTc_6PXcJl5V-fvmhbXW0jYAK1rcsSCenMWUqA&redirect_uri=http://localhost/callback&client_id=ba106265-fb3b-49e0-a0e8-6840b3d71ac2
涉及到的code參數的值就是前面獲取的authorization code,redirect_uri是前面獲取的RedirectUri ,client_id是前面獲取的ClientId參數值,Fiddler界面如下:

請求后返回的數據如下,這個 access_token的值是我們需要的,請記載下來。

Request Header中使用了如下參數:
Accept: application/json
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IlRBRzN5S3hrZW04eHppQmpmS3RSUFBoQ1liWSJ9.eyJhdWQiOiJodHRwczovL2RlbW8ubHVveW9uZy5tZS8iLCJpc3MiOiJodHRwOi8vc3RzLmx1b3lvbmcubWUvYWRmcy9zZXJ2aWNlcy90cnVzdCIsImlhdCI6MTQ3ODI1NDAzNiwiZXhwIjoxNDc4MjgyODM2LCJ1cG4iOiJjcm1hZG1pbkBsdW95b25nLm1lIiwicHJpbWFyeXNpZCI6IlMtMS01LTIxLTY1Mzc0MDc5OC0yNDUxMzM4NTMyLTMwMjU3ODY3ODktMTEwNCIsInVuaXF1ZV9uYW1lIjoiTFVPWU9OR1xcY3JtYWRtaW4iLCJhdXRoX3RpbWUiOiIyMDE2LTExLTA0VDEwOjA3OjE2LjIzMloiLCJhdXRobWV0aG9kIjoidXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmRQcm90ZWN0ZWRUcmFuc3BvcnQiLCJ2ZXIiOiIxLjAiLCJhcHBpZCI6ImJhMTA2MjY1LWZiM2ItNDllMC1hMGU4LTY4NDBiM2Q3MWFjMiJ9.B5H6VN-mZjechKo9AJuaD0tSaEo4SSr6hk7bjXyuwQuYqC4HX38SHxx0rSRQudpIZae372EdSPyjl-g_ziGT3nRZN0eEC0_hcEWKUYQY3B028-NZH8Z9oicJBnS9KlpGe678az3MtqHpclUSdQ8VdN-MjPoAFDcVh5CQW1jJpes_q7whuxx9_96R900QB5NqlcClPEt2UtOvDDJ9_qm_zdS-bWeFPnKitDc3S4SdRNhoasA2qT4bql50EgkWAJ3g34Kby7baPzE-KKtVF_u_oXt8fRF8z1vGD1_Tg4qlzNezgC1dKrjk9xF_c2MNbSkVsq5ug66t8AHlHEoNauhwkg
注意 Authorization: Bearer的后面加上一個空格,再加上前面獲取的access token的值。得到的請求返回如下:

可以看到沒有說未經授權了,調用成功。當然也可以做其他調用,比如新增記錄,Get改成POST,請求的URL是https://demo.luoyong.me/api/data/v8.1/ly_tests,請求的Request Body是 {'ly_name':'單行文本','ly_bool':true},返回的結果如下,可以看到創建記錄成功了。
