如何为Smartsheet生成重定向URI以将数据传递到Apps脚本

时间:2019-06-27 12:35:52

标签: google-apps-script uri smartsheet-api-2.0

Screenshot of smartsheet and google setup screens

当尝试从Smartsheet中获取数据时,我遇到一条错误,该错误是当我遵循由我的应用程序脚本项目记录的链接时,重定向URI丢失或无效。

我已经在Google和Smartsheet上生成了一个客户端ID和客户端密码,但我不知道下一步该怎么做。

Google凭据: 我不确定要在下面的链接中将“重定向URL”部分或授权的Java代码来源放入什么内容。

https://console.developers.google.com/apis/credentials/oauthclient/########################2d.apps.googleusercontent.com?project=project-id-##############

智能表凭据: 我已经激活了Smartsheet Developer个人资料,并为我称为“ Google表格”的应用生成了客户端ID和客户端密码。

下面显示的是我现在在gitHub上找到的代码。

var CLIENT_ID = '...'; // what do I put here?
var CLIENT_SECRET = '...';  // what do I put here?

/**
* Authorizes and makes a request to the Smartsheet API.
*/
function run()
{
    var service = getService();
    if (service.hasAccess())
    {
        var url = 'https://api.smartsheet.com/2.0/users/me';
        var response = UrlFetchApp.fetch(url,
        {
        headers:
        {
            Authorization: 'Bearer ' + service.getAccessToken()
        }
        });
        var result = JSON.parse(response.getContentText());
        Logger.log(JSON.stringify(result, null, 2));
    }
    else
    {
        var authorizationUrl = service.getAuthorizationUrl();
        Logger.log('Open the following URL and re-run the script: %s', authorizationUrl);
    }
}

/**
* Reset the authorization state, so that it can be re-tested.
*/
function reset()
{
    getService().reset();
}

/**
* Configures the service.
*/
function getService()
{
    return OAuth2.createService('Smartsheet')
    // Set the endpoint URLs.
    .setAuthorizationBaseUrl('https://app.smartsheet.com/b/authorize')
    .setTokenUrl('https://api.smartsheet.com/2.0/token')

    // Set the client ID and secret.
    .setClientId(CLIENT_ID)
    .setClientSecret(CLIENT_SECRET)
    // Set the name of the callback function that should be invoked to
    // complete the OAuth flow.
    .setCallbackFunction('authCallback')
    // Set the property store where authorized tokens should be persisted.
    .setPropertyStore(PropertiesService.getUserProperties())
    // Scopes to request
    .setScope('READ_SHEETS')
    // Set the handler for adding Smartsheet's required SHA hash parameter to
    // the payload:
    .setTokenPayloadHandler(smartsheetTokenHandler);
}

/**
* Handles the OAuth callback.
*/
function authCallback(request)
{
        var service = getService();
        var authorized = service.handleCallback(request);
    if (authorized)
    {
        return HtmlService.createHtmlOutput('Success!');
    }
    else
    {
        return HtmlService.createHtmlOutput('Denied.');
    }
}

/**
* Adds the Smartsheet API's required SHA256 hash parameter to the access token
* request payload.
*/
function smartsheetTokenHandler(payload)
{
    var codeOrRefreshToken = payload.code ? payload.code : payload.refresh_token;
    var input = CLIENT_SECRET + '|' + codeOrRefreshToken;
    var hash = Utilities.computeDigest(
        Utilities.DigestAlgorithm.SHA_256, input, Utilities.Charset.UTF_8);
    hash = hash.map(function(val)
    {
        // Google appears to treat these as signed bytes, but we need them
        // unsigned.
        if (val < 0)
        {
            val += 256;
        }
        var str = val.toString(16);
        // pad to two hex digits:
        if (str.length == 1)
        {
            str = '0' + str;
        }
        return str;
    });
        payload.hash = hash.join('');
        // The Smartsheet API doesn't need the client secret sent (secret is verified
        // by the hash).
    if (payload.client_secret)
    {
        delete payload.client_secret;
    }
    return payload;
}

/**
* Logs the redict URI to register.
*/
function logRedirectUri()
{
    Logger.log(OAuth2.getRedirectUri());
}



function dataHandler(thing)
{
    thing = getData2();
    var rowTemp = thing.split(','), i, j, chunk = 7, rows = [];
for (i=0,j=rowTemp.length; i<j; i+=chunk)
{
    for(var k = 0; k<2; k++)
    {
    rowTemp[k+2] = new Date(rowTemp[k+2])
    }
    rows.push(rowTemp.slice(i,i+chunk));
}
Logger.log(rows);
}


var CLIENT_ID = 'SmartSheet Client ID'; // I'm not sure if this is
// supposed to come from google
// or smartsheet
var CLIENT_SECRET = 'Smartsheet Client Secret'; // Same here

/**
* Authorizes and makes a request to the Smartsheet API.
*/
function run() {
var service = getService();
if (service.hasAccess()) {
    var url = 'https://api.smartsheet.com/2.0/users/me';
    var response = UrlFetchApp.fetch(url, {
    headers: {
        Authorization: 'Bearer ' + service.getAccessToken()
    }
    });
    var result = JSON.parse(response.getContentText());
    Logger.log(JSON.stringify(result, null, 2));
} else {
    var authorizationUrl = service.getAuthorizationUrl();
    Logger.log('Open the following URL and re-run the script: %s',
            authorizationUrl);
}
}

/**
* Reset the authorization state, so that it can be re-tested.
*/
function reset() {
getService().reset();
}

/**
* Configures the service.
*/
function getService()
{
    return OAuth2.createService('Smartsheet')
    // Set the endpoint URLs.
    .setAuthorizationBaseUrl('https://app.smartsheet.com/b/authorize')
    .setTokenUrl('https://api.smartsheet.com/2.0/token')
    // Set the client ID and secret.
    .setClientId(CLIENT_ID)
    .setClientSecret(CLIENT_SECRET)
    // Set the name of the callback function that should be invoked to
    // complete the OAuth flow.
    .setCallbackFunction('authCallback')
    // Set the property store where authorized tokens should be persisted.
    .setPropertyStore(PropertiesService.getUserProperties())
    // Scopes to request
    .setScope('READ_SHEETS')
    // Set the handler for adding Smartsheet's required SHA hash parameter to
    // the payload:
    .setTokenPayloadHandler(smartsheetTokenHandler);
}

/**
* Handles the OAuth callback.
*/
function authCallback(request)
{
    var service = getService();
    var authorized = service.handleCallback(request);
    if (authorized)
    {
        return HtmlService.createHtmlOutput('Success!');
    }
    else
    {
        return HtmlService.createHtmlOutput('Denied.');
    }
}

/**
* Adds the Smartsheet API's required SHA256 hash parameter to the access token
* request payload.
*/
function smartsheetTokenHandler(payload)
{
    var codeOrRefreshToken = payload.code ? payload.code : payload.refresh_token;
    var input = CLIENT_SECRET + '|' + codeOrRefreshToken;
    var hash = Utilities.computeDigest(
        Utilities.DigestAlgorithm.SHA_256, input, Utilities.Charset.UTF_8);
    hash = hash.map(function(val)
    {
        // Google appears to treat these as signed bytes, but we need them
        // unsigned.
        if (val < 0)
        {
            val += 256;
        }
        var str = val.toString(16);
        // pad to two hex digits:
        if (str.length == 1)
        {
            str = '0' + str;
        }
        return str;
    });
    payload.hash = hash.join('');
    // The Smartsheet API doesn't need the client secret sent (secret is verified
    // by the hash).
    if (payload.client_secret)
    {
        delete payload.client_secret;
    }
    return payload;
}

/**
* Logs the redict URI to register.
*/
function logRedirectUri()
{
    Logger.log(OAuth2.getRedirectUri());
}

2 个答案:

答案 0 :(得分:1)

我对您使用的Apps脚本或库了解不多,但是您需要查找Apps脚本使用的实际回调URI,并将其注册为Smartsheet中的App Redirect URL。看起来回调应该采用https://script.google.com/macros/d/{SCRIPT ID}/usercallback的形式(至少根据库文档)。那应该发出重定向,该重定向最终将使用令牌的授权代码调用您的库authCallback

这是该过程的另一个有用的文档(但使用Node)。 https://developers.smartsheet.com/blog/creating-a-smartsheet-o-auth-flow-in-node-js

答案 1 :(得分:0)

这是一个非常复杂的过程,我已经在此处进行了记录:https://smartsheet-platform.github.io/api-docs/#third-party-app-development

如果在阅读本文档/教程部分后仍有疑问,请继续询问。我在这里为您提供帮助。