iOSアプリから Slack にアクセスしてメッセージを読み書きしたくて、いろいろと調べみたのでまとめてみます。
##注意
ネットで調べると、その多くが https://api.slack.com/web の中ごろにある Generate test tokens で作られた token を用いて実装してる感じでした。
Slack の API は使い方が簡単で、 https://slack.com/api/METHOD に取得した token とかを GET でパラメーター渡しするだけですので、ちょっと試したりする分には テスト用でもいいのですが、今回はテスト用ではなくちゃんとした token を取得します。
#Never share test tokens with other users or applications. って書いてあるしね。
##Slackにアプリを登録
まずはSlackにログインして、App作成を行います。
→ https://api.slack.com/apps
作成できたら左メニューバーの App Credentials をクリックして OAuth Information を確認しておきます。
ClientID, ClientSecret, RedirectURL は後で使います。
あと、ついでに Bot Users で Botユーザーを作っておきましょう。
##OAuth2
→ https://api.slack.com/docs/oauth
流れを簡単に。
1) https://slack.com/oauth/authorize にパラメータを付けてアクセス
2) 承認を聞いてくるので、承認する
3) 承認すると指定した RedirectURL にリダイレクトされる
4) リダイレクト時に返ってくる code を記憶しておいて
5) https://slack.com/api/oauth.access にパラメータを付けてアクセス
6) access_token が返ってくるので、以後それを使用する。
取得した access_toke は意図的に revoke しない限りは有効ということなので、取り扱いには注意しましょう。
##注意はしたけれど、、、
えーと、冒頭でテスト用のトークンは application に使ったりしちゃだめ、とかって書きました。本来なら前項の OAuth2 のやり取りをプログラムして access_token を取得したほうがいいのですが、OAuth(OAuth2) でやっかいなのが、Redirect処理です。これの実装が結構面倒。
Twitter API ではこの面倒なのを回避するために AccessToken というものが発行できるようになっていて、これと ConsumetKey を使って OAuth のやり取りなしに読み書きができるようになっています。
Slack には Twitter みたいな発行ページがないため、実装するしかないのかと、、、
思いましたが、 発行された access_token は意図的に revoke しない限り有効、という点を使って、手動で発行して、それを使うことにします。
##手動OAuth2
1) 承認ページへアクセス
パラメータは client_id, scope, state です
client_id は アプリ作成したときの ClientID です。
scope はちょっと難しくて、今回は bot,channels:history にしました。
state はリダイレクトされた時に返ってきた値と比較して同じなら成功という感じです。
例) https://slack.com/oauth/authorize?client_id=xxx&scope=bot,channels:history&state=01234567
2) 承認ページが表示されます。
普通の OAuth ならここでユーザーIDとか聞いてきますが、聞いてきません。
承認するかしないかのボタンだけなので、迷わず承認ボタンを押します。
すると、本来ならここで RedirectURL へリダイレクトされるのですが、今回 redirect_uri は指定していないので、エラー画面になります。
しかしこれはわざとですので安心しましょう。ブラウザのアドレスバーに注目です。
後ろの方に ?code=xxx&state=01234567 というパラメーターが引っ付いています。
この code が大切なので記憶しておきます。state の値はアクセスした時に引っ付けたstateの値と同じであることを確認しておきます。
3) アクセストークンの取得
先ほどの code を使います。
https://slack.com/api/oauth.access にパラメータを付けてアクセスします。
パラメータは client_id, client_secret, code, redirect_url
client_id, client_secret はアプリ作成したときのやつ。
code は先ほど記憶しておいたもの。
redirect_uri は、まあ適当に http://www.example.com/OAuthCallBack とでもしておきます。
例) https://slack.com/api/oauth.access?client_id=xxx&client_secret=xxx&code=xxx&redirect_uri=hhh
redirect_url は urlencode しましょうね。
4) 結果はJSON形式で返ってくる
→ https://api.slack.com/methods/oauth.access
以上の結果から、access_token, user_id などを保存しておいて、次回以降はこれを使います。
##読み書き
利用可能な API は ここ にあるのでこれを見て実装しましょう。
ちなみに書き込みは chat.postMessage、 読み込みは channels.history です。
しかしそれぞれに要求される scope が違うみたいで、これがちょっとよく分からないところです。
最初の承認ページへのアクセス時に scope で指定するっぽいですが、よくわかりません。
scope=bot では書き込み可能でしたが、読み込めませんでした。。。謎です。。
というわけで、とりあえず書き込みは bot で、読み込みは ユーザー(管理者?)でやっていみます。。。
以上ですかね。