Last active
December 12, 2019 22:06
-
-
Save m-ando-japan/bace13d84e9cc2fbc9b591a26810195a to your computer and use it in GitHub Desktop.
freee OAuth sample
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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