我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复412或者20200517可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
使用Azure Key Vault来存储密钥等信息是个好选择,在Power Auotmate中如何获取呢?官方文档请参考 Azure REST API Reference 、Azure Key Vault REST API reference 。
在Power Automate中获取secret的值,最简单也最容易想到的是使用Azure Key Vault Connector中的Get secret来获取值。
这个Action有两中连接方式,默认的Sign in这种方式来获取Secret的值,需要这个连接的账号有Get secret的权限。
当这个flow是被Power Apps调用的时候,会传递当前打开这个Power Apps的账号过来,一般没有权限,会报错。
如果我用另外一种方式,就是 Connect with Service Principal呢?
这里需要先注册一个app并授权,登录 https://portal.azure.com/ 后,点击左侧导航栏的 Azure Active Directory ,然后选择【App registrations】 > 【New registration】。
我的设置如下:
然后添加一个Secret并保存下来。
但是如果添加API Permission的话只能添加代理权限,在我的场景下不是这个,因为Key Vault的权限只是授予了有限的几个账号,虽然我不用,但是我截图放在这儿。
我用另外的方法,到 Key Vault的界面来增加Access Policy。
我添加的界面如下,我只授予了Secret的Get权限,Principal 选择我前面新建的app:
完成添加后可以看到展示的权限如下:
使用 Connect with Service Principal 来连接,我的设置页面如下:
我设置的如下:
然后我用一个没有读取权限的普通账号打开这个Canvas App,这个app中的按钮调用了这个flow (FlowforPowerApps.Run()):
从调用记录来看会报错:
那如何解决呢?可以通过Azure REST API来做,前面的app注册后,我用类似如下的请求可以获取到Token:
POST https://login.microsoftonline.com/9870b0d6-32be-4bbc-9cd7-01d0eed5e8a2/oauth2/token
Request Header: Content-Type application/x-www-form-urlencoded
Request Body: client_id=a718371b-ddc3-4432-b503-f07786df1c35&resource=https://vault.azure.net&client_secret=4om6gLfwR8.pEDmcifN-O85lM6OA0Q3o..&grant_type=client_credentials
然后用Token发起如下请求就可以获取到 Secret 的value:
GET https://luoyongkv.vault.azure.net/secrets/Secret?api-version=7.0
Request Header: Authorization Bearer {tokenvalue}
如果这两个请求用flow来做的话,用如下三个Action即可:
第一步是HTTP这个Connector中的HTTP action:
设置如下:
第二步是 Data Operation 这个Connector中 Parse JSON action:
设置如下,当然我这里使用了返回的JSON示例来生成Schema。
第三步是HTTP这个Connector中的HTTP action,设置如下,其中用到的公式是:concat('Bearer ',body('Parse_JSON')?['access_token'])
在Power Automate中使用此种方法有个好处,就是不需要使用Power Apps的用户有读取secret的权限。