LoginSignup
27
32

More than 5 years have passed since last update.

GoogleAppsScriptでSlack OAuth2認証

Posted at

Slack Event APIをGASで使おうとして失敗した

ScriptEditorから新規スクリプト作成

ここを開いて保存する

ライブラリを追加する

OAuth2用のライブラリを追加する

ツールバーの[リソース]->[ライブラリ...]にを選択して以下のIDを入れて選択

1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF

最新のバージョンを選択して保存する。

Slack Appsを登録

ここで登録する。

Redirect URIにhttps://script.google.com/macros/d/{SCRIPT ID}/usercallbackを設定する
{SCRIPT ID}
はスクリプトエディターのツールーバーの[ファイル]->[プロジェクトのプロパティ]から確認できる。

コードを書く

SlackAppsの管理画面からClient IDClient Secretをコピペする
細かい説明はコメントとライブラリのGitHubへ

コード.js
var clientID = "...";
var clientSecret = "...";

// doGetはWebアプリケーションとして公開したとき呼ばれる関数
// HTMLとかを返す
function doGet(request) {
  var slackService = getSlackService();
  // アクセストークンを持ってるか調べる
  if (!slackService.hasAccess()) {
    var authorizationUrl = slackService.getAuthorizationUrl();
    var template = HtmlService.createTemplate('<a href="<?= authorizationUrl ?>" target="_blank">Authorize</a>.');
    template.authorizationUrl = authorizationUrl;
    return HtmlService.createHtmlOutput(template.evaluate());
  } else {
    return HtmlService.createHtmlOutput('OK');
  }
}

// slack から戻ってきた時呼ばれる関数 HTMLを返せる
// 本来はリダイレクトしてアプリケーションに戻ってもらうのがいい
function authCallback(request) {
  var slackService = getSlackService();
  var isAuthorized = slackService.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('Success!');
  } else {
    return HtmlService.createHtmlOutput('Denied.');
  }
}

// 手動実行して消せる
function clearService(){
  OAuth2.createService('slack')
  .setPropertyStore(PropertiesService.getUserProperties())
  .reset();
}

// OAuth2の設定
function getSlackService() {
  return OAuth2.createService('slack') // 任意の名前 slack使うからslackにしてる
  .setAuthorizationBaseUrl('https://slack.com/oauth/authorize')
  .setTokenUrl('https://slack.com/api/oauth.access')
  .setClientId(clientID)
  .setClientSecret(clientSecret)
  .setCallbackFunction('authCallback')
  .setPropertyStore(PropertiesService.getUserProperties()) // https://developers.google.com/apps-script/guides/properties
  .setScope('bot chat:write:bot channels:read channels:history'); // 複数scopeはスペース区切り
}

保存したら

ツールバーから[公開]->[ウェブアプリケーションとして導入]を選択して公開する。

作ったTokenを使うには

slackService.getAccessToken()でアクセストークンが取得できる

取得したTokenの使い方は自分でpayload作ってもいいのだがめんどくさいので @soundTricker さんが作ったSlackライブラリを使うのが一番手っ取り早い 詳細は以下の記事を参考にしてください

Slack BotをGASでいい感じで書くためのライブラリを作った

初期化コードはこんな感じ

var slack = SlackApp.create(getSlackService().getAccessToken());

まとめ

OAuth2のライブラリ便利だー

ちなみに失敗したってのはSlackのEvent APIを受け取るdoPostでリザルトのJSONへ辿り着くのにリダイレクトが一回挟まるが
Slackは別にリダイレクトしてくれないためエラーとなるからです。

起きたらAppEngineでリトライする

27
32
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
32