【问题标题】:How do I retrieve a bearer token from a service in Power BI?如何从 Power BI 中的服务检索不记名令牌?
【发布时间】:2020-08-13 17:47:09
【问题描述】:

我正在尝试调用 Web API,例如 https://myresources/getresources。此调用需要 API 密钥、resourcesApiKey 和不记名令牌。令牌必须从另一个服务https://mytokenservice/jwt 获取。它需要一个 API 密钥 tokenServiceApiKey。

我可以通过手动访问令牌服务并输入值来获取我的资源数据,但我希望 Power BI 为我处理所有这些。我读过一些关于这个here 的东西,但这似乎适用于静态令牌。我们的变化,所以我需要真正调用这个服务。

所以,我想做的是:

  1. 将令牌服务 URL 和 API 密钥与我的报告一起保存。运行报表时,Power BI 应使用 url 和密钥来检索不记名令牌。
  2. 将资源 API url 和 api 密钥与我的报告一起保存。将在第 1 步中检索到的不记名令牌以及资源 API 密钥应用于对资源 API url 的调用,以检索我真正想要的数据。

我认为here 描述的方法适用,但我无法让它发挥作用。以下是我最近尝试使用 Power BI 高级编辑器的方法:

  • 我使用管理参数在 Power BI 中创建了一个参数,然后使用高级编辑器,我输入了以下内容:

    网页内容( "https://mytokenservice/jwt", [ ApiKeyName="tokenServiceApiKey" ] )

我还为 tokenServiceApiKey 和 resourcesApiKey 创建了 Power BI 参数,其中包含每个参数的密钥。

但是,当我在高级编辑器中单击“完成”时,它会自动围绕我编写的内容生成一些代码,以便它现在可以读取,

Html.Table(Web.Content("https://mytokenservice/jwt",[ApiKeyName="tokenServiceApiKey"]), {})

编辑器中出现的是一个不包含数据的表格图标。我应该得到一个字符串回来。我不知道从哪里开始,并且在网上找不到答案。

有什么办法可以完成我所追求的吗?

我可能没有很好地解释它,所以如果您需要更多信息或澄清,请提出问题。

【问题讨论】:

    标签: powerbi powerbi-desktop webapi


    【解决方案1】:

    数字 1:您可以根据自己的目的构建自己的数据连接器。一些指南可以在这里找到-Click Here

    NUMber-2:您还可以使用电源查询来连接您的信号源。最近我使用 oAuth2 API 为客户收集数据。您可以使用 Power/M Query 连接到任何 API。以下是我的案例的示例代码,在第一部分中我收集了 access_token,在第二步中,我使用该访问令牌收集了数据。希望这会给您一些关于使用 Power Query 连接到任何 API 的想法。

    let
        url = "your_authentication_url_here",
    
        body  = "{ ""client_id"": ""****"",  ""client_secret"": ""****"", ""grant_type"": ""****"", ""audience"":""****""}",
        tokenResponse = Json.Document(Web.Contents(url,[Headers = [#"Content-Type"="application/json"], Content = Text.ToBinary(body) ] )),
        AccessToken = tokenResponse[access_token],
        AccessTokenHeader = "Bearer " & AccessToken,
    
    
        data_url = "your_main_url_here",
        data_body = "{
                        ""authorization"": """& AccessTokenHeader & """,
                        ""content-type"": ""application/json""
                    }",
    
        GetGroups = Json.Document(
            Web.Contents(
                data_url, 
                [
                    Headers = Json.Document(data_body)
                ] 
            )
        ),    
    
        categories = GetGroups[categories], --Category here will be changed as per your retrned data
    
        #"Converted to Table" = Table.FromList(categories, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
        #"Expanded Column1" = Table.ExpandRecordColumn
        (
            #"Converted to Table", "Column1", 
            {"ext_id", "shared", "report", "query", "_id", "description"}, --This is column returned from your data set
            {"ext_id", "shared", "report", "query", "_id", "description"}  -- Rename columns accordingly
        )
    in
        #"Expanded Column1"
    

    【讨论】:

    • 非常感谢您的回复。它帮助我完成了第 2 部分的工作(调用资源 API),但只能使用硬编码的令牌。原因是我仍然无法访问不记名令牌 API,即使我使用了类似的方法 - 即,我只是像您为“your_main_url_here”所做的那样创建了标头内容并将其设置为等于不记名令牌调用的标头范围。我收到此消息:“我们无法使用提供的凭据进行身份验证。”所以它几乎可以工作了。
    • 使用相同的代码,我从第二步动态收集不记名访问令牌和数据。您可能需要根据您的 API 设置进行一些调整。
    • “access_token”是令牌响应的属性吗?
    • 是的,您必须手动在令牌之前添加单词 bearer,如您在代码中看到的那样。
    • 不客气@RobC。希望您能尽快得到解决方案。
    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2020-12-11
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多