You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power Query自定义连接器:如何让用户输入OAuth ClientID与ClientSecret

解决Power Query自定义连接器OAuth参数用户输入问题

核心思路

通过配置连接器参数接收用户输入的ClientID和ClientSecret,再借助OAuth流程的context参数将这些值传递给StartLogin方法,无需全局变量,利用M语言的参数传递机制即可实现。

具体实现步骤

1. 定义连接器输入参数

在连接器的[DataSource.Kind]配置块中添加参数项,让用户在创建连接时输入ClientID和ClientSecret:

DataSource.Kind = "YourConnectorName",
DataSource.Path = "",
DataSource.Parameters = [
    ClientID = [
        Type = type text,
        Label = "客户端ID",
        Description = "第三方API提供的ClientID"
    ],
    ClientSecret = [
        Type = type text,
        Label = "客户端密钥",
        Description = "第三方API提供的ClientSecret",
        IsPassword = true // 标记为密码类型,输入时隐藏内容
    ]
]

2. 修改StartLogin方法提取参数

StartLogin方法的第一个参数context包含用户输入的所有连接器参数,直接从中提取即可:

StartLogin = (context, state, display) as any =>
    let
        // 从context中获取用户输入的参数
        inputParams = context[Parameters],
        clientId = inputParams[ClientID],
        clientSecret = inputParams[ClientSecret],
        // 构造第三方API的授权URL(替换为实际地址)
        authUrl = "https://第三方API授权地址/oauth/authorize?client_id=" & Uri.EscapeDataString(clientId) & "&state=" & Uri.EscapeDataString(state) & "&response_type=code"
    in
        [
            LoginUri = authUrl,
            CallbackUri = "https://oauth.powerbi.com/views/oauthredirect.html",
            WindowHeight = 600,
            WindowWidth = 800,
            Context = [ClientID = clientId, ClientSecret = clientSecret] // 将参数传递给FinishLogin使用
        ]

3. 保留原有Authentication配置

无需修改原有的Authentication结构,StartLogin会自动接收包含用户参数的context:

Authentication = [
    OAuth = [
        StartLogin = StartLogin,
        FinishLogin = FinishLogin,
        Label = Extension.LoadString("AuthenticationLabel")
    ]
]

4. 在FinishLogin中复用参数

如果换取token需要用到ClientSecret,可从StartLogin返回的Context中提取:

FinishLogin = (context, callbackUri, state) as any =>
    let
        // 从StartLogin传递的Context中获取参数
        clientId = context[ClientID],
        clientSecret = context[ClientSecret],
        // 提取回调URL中的授权码
        authCode = Uri.Parts(callbackUri)[Query][code],
        // 构造token请求(替换为第三方API的token地址)
        tokenUrl = "https://第三方API令牌地址/oauth/token",
        tokenBody = "grant_type=authorization_code&code=" & Uri.EscapeDataString(authCode) & "&client_id=" & Uri.EscapeDataString(clientId) & "&client_secret=" & Uri.EscapeDataString(clientSecret) & "&redirect_uri=https://oauth.powerbi.com/views/oauthredirect.html",
        tokenResponse = Web.Contents(tokenUrl, [
            Headers = [Content-Type = "application/x-www-form-urlencoded"],
            Content = Text.ToBinary(tokenBody)
        ]),
        tokenJson = Json.Document(tokenResponse)
    in
        [
            AccessToken = tokenJson[access_token],
            RefreshToken = tokenJson[refresh_token],
            Expires = DateTime.LocalNow() + #duration(0, 0, tokenJson[expires_in], 0)
        ]

关键注意事项

  • 所有参数传递时需用Uri.EscapeDataString处理特殊字符,避免URL编码错误。
  • 标记IsPassword = true的参数会以掩码形式显示,提升输入安全性。
  • 全程通过函数参数和返回值传递参数,无需全局变量,符合M语言的函数式编程逻辑。

内容的提问来源于stack exchange,提问作者Power User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:45:21