我正在尝试在 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 流量):
如何更新Office脚本才能成功获取令牌?
无法登录或使用 OAuth2 类型的身份验证流程。所有密钥和凭据都必须进行硬编码(或从其他来源读取)。
但是 ...您可能已经知道这一点并且想要重新实现 OAuth2 流程。
您是否尝试过使用
HTTP OPTIONS
和标头 HTTP_OK
来响应 Access-Control-Allow-Origin: *
请求?
然后您应该会看到
HTTP POST
请求。