Dynamics CRM模拟OAuth请求获得Token后在外部调用Web API
关注本人微信和易信公众号: 微软动态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 ,如下所示,这两个参数后面会用到的。
![](https://img2018.cnblogs.com/blog/779910/201903/779910-20190326222915879-1548682551.png)
注意这个URL中的前面部分是你的STS服务器的URL,我这里监控的是444端口,client_id换成前面的ClientId参数值,redirect_uri换成前面获取的RedirectUri参数值,resource参数是你访问的CRM的URL。打开的页面如下:
![](https://img2018.cnblogs.com/blog/779910/201903/779910-20190326222952348-617685548.png)
输入用户名和密码,点击登录后界面如下:
![](https://img2018.cnblogs.com/blog/779910/201903/779910-20190326223037739-1535323088.png)
出错是因为我让它跳转的页面是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界面如下:
![](https://img2018.cnblogs.com/blog/779910/201903/779910-20190326223134188-471343333.png)
请求后返回的数据如下,这个 access_token的值是我们需要的,请记载下来。
![](https://img2018.cnblogs.com/blog/779910/201903/779910-20190326223213874-62473282.png)
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的值。得到的请求返回如下:
![](https://img2018.cnblogs.com/blog/779910/201903/779910-20190326223252981-658144061.png)
可以看到没有说未经授权了,调用成功。当然也可以做其他调用,比如新增记录,Get改成POST,请求的URL是https://demo.luoyong.me/api/data/v8.1/ly_tests,请求的Request Body是 {'ly_name':'单行文本','ly_bool':true},返回的结果如下,可以看到创建记录成功了。
![](https://img2018.cnblogs.com/blog/779910/201903/779910-20190326223339811-1789713951.png)