使用 Fetch 通过 Excel 脚本进行 Oauth2 令牌请求返回无法获取

问题描述 投票:0回答:1

我正在尝试在 Office 脚本中创建一个函数来获取 Oauth API 令牌。我在 Powershell 中有一个工作令牌请求示例,并尝试使用

fetch
在 Office 脚本中创建相同的请求,但在 Office 脚本中收到
failed to fetch
错误。

此 PowerShell 函数成功检索令牌:

#requires -Version 3.0
function New-ApiAccessToken
{
    param
    (
        [string]$apiUrl,
        [string]$apiKey,
        [string]$apiSecretKey
    )

    # Specify security protocols
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'

    # Convert password to secure string
    $securePassword = ConvertTo-SecureString -String 'public' -AsPlainText -Force

    # Define parameters for Invoke-WebRequest cmdlet
    $params = @{
        Credential  =   New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ('public-client', $securePassword)
        Uri         =   '{0}/auth/oauth/token' -f $apiUrl
        Method      =   'POST'
        ContentType =   'application/x-www-form-urlencoded'
        Body        =   'grant_type=password&username={0}&password={1}' -f $apiKey, $apiSecretKey
    }
    
    # Request access token
    try {(Invoke-WebRequest @params | ConvertFrom-Json).access_token}
    catch {$_.Exception}
}

# Define parameters
$params = @{
    apiUrl          =   'myurlhere'
    apiKey          =   'thekey'
    apiSecretKey    =   'thesecretkey'
}

# Call New-ApiAccessToken function using defined parameters 
New-ApiAccessToken @params

Excel/Office 脚本中的以下脚本在获取行上返回

failed to fetch

async function getToken() {
  let url = 'myurlhere';
  let client_id = 'public-client';
  let client_secret = 'public';
  let username = 'thekey';
  let password = 'thesecretkey';

  let basicAuth: string = base64Encode(client_id + ":" + client_secret).toString();
  let bodyParams: URLSearchParams = new URLSearchParams();
  bodyParams['grant_type'] = 'password';
  bodyParams['username'] = username;
  bodyParams['password'] = password;

  let response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Accept': 'application/json; charset=UTF-8',
      'Authorization': 'Basic ' + basicAuth
    },
    body: bodyParams
    });

  let token: string = await response.json();
  console.log(token)  
}

当我使用 Fiddler 观看通话时(启用了解密 HTTPS 流量):

  • PowerShell 脚本显示 2 个 POST 调用;第一个返回响应代码 401,第二个获取响应代码 200 的令牌
  • Office 脚本显示一个 OPTIONS 调用,该调用返回响应代码 401,没有第二次调用

如何更新Office脚本才能成功获取令牌?

typescript oauth-2.0 cors fetch office-scripts
1个回答
0
投票

根据 Office 脚本外部调用的限制

无法登录或使用 OAuth2 类型的身份验证流程。所有密钥和凭据都必须进行硬编码(或从其他来源读取)。

但是 ...您可能已经知道这一点并且想要重新实现 OAuth2 流程。

您是否尝试过使用

HTTP OPTIONS
和标头
HTTP_OK
来响应
Access-Control-Allow-Origin: *
请求?

然后您应该会看到

HTTP POST
请求。

© www.soinside.com 2019 - 2024. All rights reserved.