Zaimでは外部のサービスと連携するためにAPIを公開している。
認証はoAuth1.0aに対応しているのだが、GoogleAppsScriptと相性が悪いのか、
oAuthエラーというエラーが発生し認証に失敗する。
丸1日費やしたが失敗の原因がわからないのでひとまず撤収。
もし「できる!知ってるよ!」という方がいたら教えてください。
私が書いたコードを一応のせておきます。
var oAuthConfig = function(serviceName,accessTokenURL,requestTokenUrl,authorizationUrl){
var m_methods = {};
var m_oAuthConfig = UrlFetchApp.addOAuthService(serviceName);
m_oAuthConfig.setAccessTokenUrl( accessTokenURL );
m_oAuthConfig.setRequestTokenUrl( requestTokenUrl );
m_oAuthConfig.setAuthorizationUrl( authorizationUrl );
var setConsumerKeyAndSecret = function(key,secret){
ScriptProperties.setProperty('consumerKey', key);
ScriptProperties.setProperty('consumerSecret', secret);
m_oAuthConfig.setConsumerKey(ScriptProperties.getProperty('consumerKey'));
m_oAuthConfig.setConsumerSecret(ScriptProperties.getProperty('consumerSecret'));
}
m_methods.setConsumerKeyAndSecret = setConsumerKeyAndSecret;
var getConfig = function(){ return m_oAuthConfig; }
m_methods.getConfig = getConfig;
var authConfigDump = function(){
Logger.log('AccessTokenURL->' + m_oAuthConfig.getAccessTokenUrl());
Logger.log('AuthorizationUrl->'+ m_oAuthConfig.getAuthorizationUrl());
Logger.log('Method->' + m_oAuthConfig.getMethod());
Logger.log('ParameterLocation->' + m_oAuthConfig.getParamLocation());
Logger.log('RequestTokenURL->' + m_oAuthConfig.getRequestTokenUrl());
Logger.log('ServiceName->' + m_oAuthConfig.getServiceName());
}
m_methods.authConfigDump = authConfigDump;
//create nonce from SHA-1 Digest
var getNonce = function(){
var now = new Date();
var nonce = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_1,now.getTime(),Utilities.Charset.US_ASCII);
var strNonce = bytes2StringDigest(nonce);
Logger.log('nonce(bytes2StringDigest)->' + strNonce);
return strNonce;
}
m_methods.getNonce = getNonce;
return m_methods;
}
var urlString = function(url){
var m_methods = {};
var m_response = UrlFetchApp.getRequest(url);
var m_methodName = m_response.method;
var m_url = m_response.url;
var getMethod = function(){return m_methodName;}
m_methods.getMethod = getMethod;
var getUrl = function(){ return encodeURIComponent( m_url.split('?')[0] );}
m_methods.getUrl = getUrl;
var getQueryStrings = function(){ return encodeURIComponent( m_url.split('?')[1] ); }
m_methods.getQueryStrings = getQueryStrings;
var dump = function(){
for(var i in m_response) {
Logger.log(i + ": " + m_response[i]);
}
}
m_methods.dump = dump;
return m_methods;
}
var getOAuthSignature = function(url,common_param_oauth){
//HASHMAC Signature
var urlStr = urlString(url);
var sign_url = encodeURIComponent(urlStr.getUrl());
var sign_param = encodeURIComponent(urlStr.getQueryStrings());
var sign_source = 'GET' + '&'+ sign_url + '&' +
// 'oauth_body_hash' + encodeURIComponent('=') + common_param_oauth.oauth_body_hash + '&' +
'oauth_consumer_key' + encodeURIComponent('=') + common_param_oauth.oauth_consumer_key + '&' +
'oauth_nonce' + encodeURIComponent('=') + common_param_oauth.oauth_nonce +'&' +
'oauth_signature_method' + encodeURIComponent('=') + common_param_oauth.oauth_signature_method +'&' +
'oauth_timestamp' + encodeURIComponent('=') + common_param_oauth.oauth_timestamp + '&' +
'oauth_version' + encodeURIComponent('=') + '1.0';
//if (sign_param != undefined){ sign_source = sign_source + '&' + sign_param }
Logger.log('SIGN_SOURCE->' + sign_source);
//create Signature(HMAC SHA-1) and encode BASE64.
var tmpSignature = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_1,sign_source,common_param_oauth.oauth_consumer_key);
common_param_oauth.oauth_signature = Utilities.base64Encode(tmpSignature);
Logger.log('Signature(bytecode)->' + tmpSignature );
Logger.log('Signature(base64)->' + common_param_oauth.oauth_signature );
return common_param_oauth.oauth_signature;
}
/////////////////////
//MAIN
/////////////////////
function main(){
var serviceName = 'Zaim';
var accessTokenUrl = "https://api.zaim.net/v2/auth/access";
var requestTokenUrl = "https://api.zaim.net/v2/auth/request";
var authorizationUrl = "https://www.zaim.net/users/auth";
var key = 'Your consumerKey';
var secret = 'Your consumerSecret';
var methodName = 'get'; //default get
var paramLocation = 'auth-header'; //Allowed values are 'post-body', 'uri-query' and 'auth-header'.
var tergetUrl = 'https://api.zaim.net/v2/home/user/verify';
var response='';
try{
var oAuthConf = oAuthConfig(serviceName,accessTokenUrl,requestTokenUrl,authorizationUrl);
oAuthConf.setConsumerKeyAndSecret(key,secret);
oAuthConf.authConfigDump();
oAuthConf.getConfig().setMethod( methodName );
oAuthConf.getConfig().setParamLocation( paramLocation );
oAuthConf.authConfigDump();
Logger.log('key->' + ScriptProperties.getProperty('consumerKey'));
Logger.log('secret->' + ScriptProperties.getProperty('consumerSecret'));
var now = new Date();
var common_param_oauth =
{
'oauth_consumer_key' : ScriptProperties.getProperty('consumerKey'),
'oauth_signature' : '', //see after code.
'oauth_signature_method' : 'HMAC-SHA1',
'oauth_token' : '',
//'oauth_timestamp' : now.getTime(),
//'oauth_nonce' : oAuthConf.getNonce(),
'oauth_timestamp' : '',
'oauth_nonce' : '',
'oauth_version' : '1.0'
//'oauth_body_hash' : ''
};
getOAuthSignature(tergetUrl,common_param_oauth );
Logger.log('COMMON_PARAM_OAUTH->' + Utilities.jsonStringify(common_param_oauth));
var options =
{
"oAuthServiceName" : serviceName,
"oAuthUseToken" : "always",
"method" : methodName,
//"headers" : '',
//"payload" : common_param_oauth,
"muteHttpExceptions" : true
};
Logger.log('options->' + Utilities.jsonStringify(options));
//var response = UrlFetchApp.fetch( tergetUrl );
response = UrlFetchApp.fetch( tergetUrl , options );
}catch(e){
Logger.log('main failure.' + e.message);
}
}
2013/11/27
再チャレンジしたが認証エラーでやはりNG。
上のソースコードはかなり間違いがあるのだが、再度oauth_signatureの作成方法(アルゴリズム、パラメータのソート、URIエンコード・・・)などを
oauth1.0の仕様書に基づきトライしてもダメ。
ということでGoogle Apps Scriptとの連携は一旦あきらめる。
0 件のコメント:
コメントを投稿