利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API

微软动态CRM专家罗勇 ,回复337或者20190521可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me.

配置Dynamics 365 & PowerApps 支持OAuth 2 Client Credentials认证参考我前面的博文:Dynamics 365 Online通过OAuth 2 Client Credential授权(Server-to-Server Authentication)后调用Web API 。编程方法可以参考这篇博文,为了方便不同的编程语言明白如何通过这个认证后调用调用Dynamics 365 & PowerApps的Web API,我这里用Fiddler来模拟。

首先是认证,请参考 Client Credentials ,值得注意的是,请求body中需要增加传递参数resource,否则后续调用Web API会返回401(未认证) .我这里直接上Fiddler请求截图如下:

 利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API

简单解释下上面请求。是发起POST请求,请求的URL是: https://login.windows.net/{{tenantid}}/oauth2/token ,请求URL中的 {{tenantid}} 请替换为Azure Tenant的Id。

请求的Body是 grant_type=client_credentials&client_id={{clientid}}&client_secret={{clientsecret}}&resource={{resourceurl}} ,请将 {{clientid}} 替换为注册App时候生成的Application (client) ID,{{clientsecret}}替换为注册App时候生成的Client Secret,{{resourceurl}}请换成你要访问的Dynamics 365 或者PowerApps的URL,比如 https://CRM244271.crm.dynamics.com/ ,注意用要urlencode一下,若用javascript的话,就用 encodeURIComponent 函数对这个URL进行处理,如下图所示。

利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API

可以看到截图,请求成功,请求返回内容如下:

利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API

我格式化一下返回内容如下:

{
    "token_type":"Bearer",
    "expires_in":"3600",
    "ext_expires_in":"3600",
    "expires_on":"1558408667",
    "not_before":"1558404767",
    "resource":"https://CRM244271.crm.dynamics.com/",
    "access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkhCeGw5bUFlNmd4YXZDa2NvT1UyVEhzRE5hMCIsImtpZCI6IkhCeGw5bUFlNmd4YXZDa2NvT1UyVEhzRE5hMCJ9.eyJhdWQiOiJodHRwczovL0NSTTI0NDI3MS5jcm0uZHluYW1pY3MuY29tLyIsImlzcyI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2IxOGQzYzZmLTM4YzYtNDkyZC1hMDcwLThiNzUyZjA5ZjBkZS8iLCJpYXQiOjE1NTg0MDQ3NjcsIm5iZiI6MTU1ODQwNDc2NywiZXhwIjoxNTU4NDA4NjY3LCJhaW8iOiI0MlpnWURDVHVDLzRKK1RvamJoOW04NVZILzd3R0FBPSIsImFwcGlkIjoiZjUwMTM0NmMtNGQzMi00MWI5LWIyOTAtMzNmN2JlYTRlYzZhIiwiYXBwaWRhY3IiOiIxIiwiaWRwIjoiaHR0cHM6Ly9zdHMud2luZG93cy5uZXQvYjE4ZDNjNmYtMzhjNi00OTJkLWEwNzAtOGI3NTJmMDlmMGRlLyIsIm9pZCI6IjU0YWNmNzczLWNhNDAtNGY0Zi04ZTBlLTc1ZjM3M2M5OTU3NiIsInN1YiI6IjU0YWNmNzczLWNhNDAtNGY0Zi04ZTBlLTc1ZjM3M2M5OTU3NiIsInRpZCI6ImIxOGQzYzZmLTM4YzYtNDkyZC1hMDcwLThiNzUyZjA5ZjBkZSIsInV0aSI6ImNaY25nRUJKbEUyYWV2X1pUUTBJQUEiLCJ2ZXIiOiIxLjAifQ.EGK7DMpm_L9TnTREdw5EVhB6WAPNxGmhhodHm7mJsVtmabrL4UXrupQV8Dy6bq6reCGU3v2uA3mtbJ6HXkSbdL7hbEXnDQ_Iw0TD5a-pnmqz7I27_5D40Ia0ctQJPioo7o5bDhtkn3ppC6a6fXssWglUOwtiu-rZH9Ui_CMkz5azq_SIb4o5rbMrApAbxSsv0F60MIKO3s5zUJS7HSYAk4p6LYtrVLDcAQXEHHGHr-7FjvOn-H42Olg1Ro_EudWgo1zLBLrBJ7lMxK2D48SYvQmPYeueJDmVOCpUWdBubF52oSL6y6rVaFzkegNOJSXPE6m2VGDCe3_gNrMke8_jSg"
}

重要的内容是access_token的值,还有就是expires_in,可以知道这个access token获取后3600秒也就是一个小时后过期。

拿到access token后就可以请求了,我发起一个GET请求如下:

请求的URL根据你的操作而定,一般是类似 https://CRM244271.crm.dynamics.com/api/data/v9.1/ 开头

值得注意的是要在请求头中添加认证信息,这里是类似:Authorization: Bearer {{access token}} 。

利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API

 可以看到调用成功,返回了数据:

利用Fiddler模拟通过Dynamics 365的OAuth 2 Client Credentials认证后调用Web API