Slack App(bot)のgranular permissionsの対応方法

#はじめに

Slack App(bot)で<b>granular permissions</b>(細かな権限設定)が出来るようになりました。

アプリの管理画面にいくと、このように注意書きが表示されるようになっていました。
![スクリーンショット 2020-03-06 14.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/1a920be7-c52f-9c67-272a-3295db658575.png)

https://medium.com/slack-developer-blog/more-precision-less-restrictions-a3550006f9c3
https://api.slack.com/authentication/migration?utm_medium=referral&utm_source=apiblog&utm_campaign=fy20-Q401-granular-permissions
詳細は上記のBlogと公式ドキュメントに記載してありますが、簡単に要約すると以下のようです

- <b>Slack Appでより細かな権限設定=granular permissionsを設定出来るようになった</b>
- <b>2020/2/21以降、granular permissionsに対応していない新規アプリの提出は拒否される</b>
- <b>Slack App Directoryにある既存のアプリも2020年度の終わりまでに移行しなければならない</b>

現在、<a href="https://www.kiara-app.com">Kiara Translation</a>というSlack上で動く自動翻訳アプリをリリース＆<a href="https://slack.com/apps/AH2RMPP71-kiara-translation">Slack App Directoryに公開</a>しているのですが、最近そのgranular permissionsに対応しました。

日本語ドキュメントも少なかったので、その方法を公開することで少しでもgranular permissionsにupdateする方の助けになれば幸いです。

# 対応方法

## 1. Slack Dashboard上で必要なスコープを選ぶ
自分のSlack AppのダッシュボードのOAuth & Permissions画面に行きます。
<img width="500" alt="スクリーンショット 2019-08-16 12.10.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/92ae8239-1e53-c944-3852-00f5daac6e01.png">

こちら「OAuth Scope」に「bot」と記載してあると思いますが、このScopeは以下の画像のように多くのScopeを含んでいます。
<b>しかし、今回のupdateによって必要最低限のScopeを設定出来るようになるというわけです。</b>
(この対応をすることでセキュリティが向上しますし、Slack Appを追加する時に表示されるAuthorize画面にて、必要最低限のScopeだけが表示されるので、ユーザーさんの安心感も異なってくるかと思います)

先ほどの画面で「update scopes」を選択して、必要最低限のスコープだけをここで選びましょう。
<img width="500" alt="スクリーンショット 2019-08-16 12.10.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/389103ac-14ca-8734-63b8-a7c22fea348a.png">

↓

今回は以下のようなScopeを選択しました。(後からでも変更可能です)
「Yes, migrate my app」を選択します。
<img width="500" alt="スクリーンショット 2019-08-16 12.10.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/40f7a11b-2073-d3e9-3e29-afe02046f536.png">
↓
記載してあるように、authentication URLを変更する必要があるので、このURLはどこかに保存しておきます。
今回の場合は以下のURLになります(clinet_idはご自身のものに変更してください)
```https://slack.com/oauth/v2/authorize?client_id=*****&scope=app_mentions:read,channels:read,chat:write,groups:read
```

問題なければ「I've updated my app」を選択します。
<img width="500" alt="スクリーンショット 2019-08-16 12.10.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/f7596dfa-db8a-6f17-fd61-498743317a9a.png">
↓
再び「OAuth & Permissions」画面に戻ります。
今回は「Bot Token Scopes」だけでなく「User Token Scopes」の説明もしたいので、「im:history」を新たに追加しました。
<img width="500" alt="スクリーンショット 2019-08-16 12.10.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/1ff4d970-f78f-502c-c1cc-305d969446ca.png">

## 2. URLを変更する
次はURLを新しいものに変更していきます
### ```authorize``` → ```v2/authorize```に変更
公式ドキュメント：https://api.slack.com/authentication/oauth-v2
今まで```https://slack.com/oauth/authorize```となっていたauthenticationのURLを
先ほどの手順でコピーした新たなURL(```https://slack.com/oauth/v2/authorize```)に変更します。
(v2が追加される形ですね)

※<b>注意点</b>
先ほどコピーしたURLは
```https://slack.com/oauth/v2/authorize?client_id=*****&scope=app_mentions:read,channels:read,chat:write,groups:read```
だったと思うのですが、今回は手順の最後に「User Token Scopes」で、「im:history」を追加したと思います。

「User Token Scopes」はuser_scopeパラメータをURLに含める必要があるみたいなので、最終的に置き換えるURLは以下のようになることに注意してください。
```https://slack.com/oauth/v2/authorize?client_id=*****&scope=app_mentions:read,channels:read,chat:write,groups:read&user_scope=im:history```

### ```oauth.access``` → ```oauth.v2.access```に変更

公式ドキュメント：https://api.slack.com/authentication/oauth-v2

URL```https://slack.com/api/oauth.access```を
```https://slack.com/api/oauth.v2.access```に変更します

こちらResponseも```oauth.access```と```oauth.v2.access```で異なるため、以下の資料を参考にしながらコードを変更して下さい。

oauth.access: https://api.slack.com/methods/oauth.access
oauth.v2.access: https://api.slack.com/methods/oauth.v2.access

## 3. 審査に出す

後はいつものように審査に出して承認されれば完了となります

※ユーザーさんに新たなScopeを適応もらうためには、アプリを再インストールする必要があります。
したがって、  

 - 旧Scopeでもslack appは動作する
 - 新Scopeに対応し、再インストールしてもらう旨を何かしらの方法(direct messageなど)で通知する

なども必要に応じて確認出来れば良いと思います。

![スクリーンショット 2020-03-06 16.10.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482888/30d9e2de-4ffc-8faf-129b-25436dabf16d.png)

# リンク集
- https://medium.com/slack-developer-blog/more-precision-less-restrictions-a3550006f9c3
    - Granular Permissionについて
- https://api.slack.com/authentication/oauth-v2
    - OAuthのフロー
- https://api.slack.com/methods/oauth.access
    - ```oauth.access```methodのドキュメント
- https://api.slack.com/methods/oauth.v2.access
    - ```oauth.v2.access```methodのドキュメント
- <a href="https://api.slack.com/authentication/quickstart">Quickstart: differences between old and new Slack apps</a>