• 通过重复运行的Microsoft Flow由OAuth认证后获取Access Token并将其更新到实体记录


    我是微软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'. Trace ID: ccb315ef-4fbb-4c3b-ad40-825dfd7c4a00 Correlation ID: 8cce0977-0d45-43cb-a0ba-9b911bd949e1 Timestamp: 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】,然后设置相应字段的值类似如下。

  • 相关阅读:
    201521123061 《Java程序设计》第十三周学习总结
    201521123061 《Java程序设计》第十二周学习总结
    201621123034 《Java程序设计》第14周学习总结
    201621123034 《Java程序设计》第13周学习总结
    201621123034 《Java程序设计》第12周学习总结
    201621123034 《Java程序设计》第11周学习总结
    201621123034 《Java程序设计》第10周学习总结
    201621123034 《Java程序设计》第9周学习总结
    201621123034 《Java程序设计》第8周学习总结
    201621123034 《Java程序设计》第7周学习总结
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Microsoft_Scheduled_Flow_HTTP_OAuth_Dynamics_365_PowerApps.html
Copyright © 2020-2023  润新知