Skip to content

Instantly share code, notes, and snippets.

@m-ando-japan
Last active December 12, 2019 22:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save m-ando-japan/bace13d84e9cc2fbc9b591a26810195a to your computer and use it in GitHub Desktop.
Save m-ando-japan/bace13d84e9cc2fbc9b591a26810195a to your computer and use it in GitHub Desktop.
freee OAuth sample
jQuery.noConflict();
(function($) {
'use strict';
// UUIDを生成する
function generateUuid() {
// https://github.com/GoogleChrome/chrome-platform-analytics/blob/master/src/internal/identifier.js
// const FORMAT: string = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";
let chars = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split("");
for (let i = 0, len = chars.length; i < len; i++) {
switch (chars[i]) {
case "x":
chars[i] = Math.floor(Math.random() * 16).toString(16);
break;
case "y":
chars[i] = (Math.floor(Math.random() * 4) + 8).toString(16);
break;
}
}
return chars.join("");
}
kintone.events.on([
'app.record.create.submit',
'app.record.edit.submit'
], function(event) {
//UUIDをstateに設定する
event.record.state.value = generateUuid();
return event;
});
kintone.events.on([
'app.record.create.submit.success',
'app.record.edit.submit.success'
], function(event) {
location.href = 'https://accounts.secure.freee.co.jp/public_api/authorize?' +
'client_id=' + event.record.clientId.value +
'&redirect_uri=' + encodeURIComponent('https://' + location.host + '/k/' + kintone.app.getId() + '/') +
'&response_type=code' +
'&state=' + event.record.state.value;
return event;
});
kintone.events.on('app.record.index.show', function(event) {
var record; // 情報を保存する
kintoneUtility.rest.getRecords({
app: kintone.app.getId(),
query: '作成者 in (LOGINUSER())'
}).then(function(response){
if (response.records.length !== 1) return;
record = response.records[0];
// Queryパラメータ取得
var queryString = location.search;
// 有効期限判定
var valid = false;
if (record.expiresDateTime.value) {
var expiresDateTime = new Date(record.expiresDateTime.value);
if (new Date() < expiresDateTime && record.accessToken.value) {
valid = true;
}
}
// 有効期限切れの場合
if (!valid && record.refreshToken.value) {
var body = 'grant_type=refresh_token' +
'&client_id=' + record.clientId.value +
'&client_secret=' + record.clientSecret.value +
'&redirect_uri=' + encodeURIComponent('https://' + location.host + '/k/' + kintone.app.getId() + '/') +
'&refresh_token=' + record.refreshToken.value;
var header = {
'Content-Type': 'application/x-www-form-urlencoded'
};
return kintone.proxy('https://accounts.secure.freee.co.jp/public_api/token', 'POST', header, body);
}
// freeeの認可コード付で開かれた場合のみ処理する
else if (queryString.substr(0, 6) === '?code=') {
var queries = queryString.substr(1).split('&');
var params = {};
queries.forEach(function(query){
var kv = query.split('=');
params[kv[0]] = kv[1];
});
if (!params.code || params.state !== record.state.value) {
alert('freeeの認証情報取得に失敗しました。');
return;
}
// 読み取った認可コードを使って認証する
var body = 'grant_type=authorization_code' +
'&client_id=' + record.clientId.value +
'&client_secret=' + record.clientSecret.value +
'&redirect_uri=' + encodeURIComponent('https://' + location.host + '/k/' + kintone.app.getId() + '/') +
'&code=' + params.code +
'&state=' + params.state;
var header = {
'Content-Type': 'application/x-www-form-urlencoded'
};
return kintone.proxy('https://accounts.secure.freee.co.jp/public_api/token', 'POST', header, body);
}
else {
// 認証情報を使ってAPIを呼び出す
var header = {
'Authorization': 'Bearer ' + record.accessToken.value
};
return kintone.proxy('https://api.freee.co.jp/api/1/companies', 'GET', header, {}).then(function(response) {
if (response[1] !== 200 && response[1] !== 201) {
console.log(response);
alert('APIの呼び出しが失敗しました。');
return;
}
var result = JSON.parse(response[0]);
console.log(result);
alert(
'取得した事業所名\n' +
result.companies[0].name
);
return;
});
}
}).then(function(response) {
if (!response) return;
if (response[1] !== 200 && response[1] !== 201) {
console.log(response);
alert('認証の呼び出しが失敗しました。');
return;
}
// freeeのOAuth認証が成功した場合
var credentials = JSON.parse(response[0]);
// 有効期限を日付に変換
var expiresDateTime = new Date(credentials.created_at * 1000 + credentials.expires_in * 1000);
// 認証レコードを更新
return kintoneUtility.rest.putRecord({
app: kintone.app.getId(),
id: record.$id.value,
record: {
accessToken: { value: credentials.access_token },
refreshToken: { value: credentials.refresh_token },
expiresDateTime: { value: expiresDateTime.toISOString() },
}
});
}).then(function(response){
if (!response) return;
// 認証情報レコードの更新に成功しているので、一覧を再度呼び出す
location.href = location.pathname ;
return 'success';
}).then(function(auth){
if (!auth && !record &&confirm('認証情報を再取得しますか?')) {
location.href = location.pathname + 'edit';
}
});
return event;
});
kintone.events.on('app.record.create.show', function(event) {
var header = $(kintone.app.record.getHeaderMenuSpaceElement());
console.log(header);
header.append($(
'<div style="padding: 15px 30px">' +
'<a href="https://app.secure.freee.co.jp/developers/applications" target="_blank">freee連携アプリ設定を開く</a>' +
'</div>'
));
});
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment