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
相关产品推荐
相关产品推荐

