slackのoauth2.0について

apiのdocのAuthenticationのブロックのあたり

https://api.slack.com/docs/oauth

# Using Oauth 2.0
[register your app](https://api.slack.com/apps)すると
- Client ID
- Client Secret
が作成される。Client Secretは共有してはならない

appはworkspacesにインストールする

## Obtaining access tokens with OAuth 2.0

```
{
    "access_token": "xoxp-23984754863-2348975623103",
    "scope": "read"
}
```

上記のような形式のトークンがアクセストークンでいわゆるbearer tokenである。トークンのタイプに関しては[ここ](https://api.slack.com/docs/token-types)を参照。

## Bot user tokens
rtm.connectもしくは[Web API](https://api.slack.com/web)を使うのならbot user アクセストークンを使うのが望ましい。

```
{
    "access_token": "xoxp-XXXXXXXX-XXXXXXXX-XXXXX",
    "scope": "incoming-webhook,commands,bot",
    "team_name": "Team Installing Your Hook",
    "team_id": "XXXXXXXXXX",
    "incoming_webhook": {
        "url": "https://hooks.slack.com/TXXXXX/BXXXXX/XXXXXXXXXX",
        "channel": "#channel-it-will-post-to",
        "configuration_url": "https://teamname.slack.com/services/BXXXXX"
    },
    "bot":{
        "bot_user_id":"UTTTTTTTTTTR",
        "bot_access_token":"xoxb-XXXXXXXXXXXX-TTTTTTTTTTTTTT"
    }
}
```
botアクセストークンは必ずxoxbで始まる。トークンはshareしてはならない。

## Storing tokens securely
トークンのセキュアな保持の仕方は[ここ](https://api.slack.com/docs/oauth-safety)を参照。

WebAPIのIPアクセス制限も可能。

## Using access tokens
GETメソッドのヘッダーに含めたりPOSTメソッドのbodyに含めることができる。

## Setting up your Redirect URL
オプションで設定できる。ここでは省略

## Handling multiple authorizations
appが自身のサービスのログインにslackを使っている場合、初期のOAuthリクエストのスコープはidentifyに限り、正常にログインした後、files:readの権限等を付与したい場合もある。そういった時にmultiple authorizationは役に立つ

appはインストールせずにユーザの認証のみしたい場合も使える？

## Revoking tokens
トークンの再発行も可能

# Oauth Scopes (Permissions System)

Oauth permission scopesは下記の使い方を制御している
- [Slack Apps](https://api.slack.com/slack-apps)
- [Web API](https://api.slack.com/web)
- [Events API](https://api.slack.com/events)
- [RTM API](https://api.slack.com/rtm)
- [Slash Commands](https://api.slack.com/slash-commands)
- [Incomming Webhooks](https://api.slack.com/incoming-webhooks)

[個別のIntegration](https://api.slack.com/custom-integrations)に関してはOauth scopeの範疇ではない。

## Types of Scopes

`file:write`のような形式で、アクセスが認可されるオブジェクトに続いてactionが定義される。中には`chat:write:user`のようにオプショナルなperspectiveが定義されているものもある。
アクションは現在は以下の3つが存在する。
- read
- write
- history

## OAuth Scopes to Events API methods
Event APIの[event types](https://api.slack.com/events/api)へのsubscriptionsも制御可能。

## Slack app scopes

- incoming-webhook
  - 一つのchannelに簡単にpostできる。
- commands
  - appにスラッシュコマンドをバンドル
- bot
  - [bot user](https://api.slack.com/bot-users)の機能を持つapp

## Special scopes

- identify
    - アプリにidentity confirmを許可する
- client
    - アプリにslack clientとしての接続を許可し、ユーザのような振る舞いを許可する
- admin
    - アプリに管理アクションを許可する。adminユーザとしての認証・認可を必要とする

## scopeの使い方
`teams:read users:read`を含める場合は下記のようにリクエストを出す

```
https://slack.com/oauth/authorize?
  client_id=...&
  scope=team%3Aread+users%3Aread
```

レスポンスは次のようなものを想定する

```
$ curl https://slack.com/api/files.list?token=abcd -I
HTTP/1.1 200 OK
X-OAuth-Scopes: files:read, chat:write:bot
X-Accepted-OAuth-Scopes: files:read
```

# Scopes
https://api.slack.com/scopes

# Token types
下記のようなtypeがある

- user
- bot
- workspace
- legacy
- verification

## User tokens
`xoxp-`で始まる

## Bot user tokens
`xoxb-`で始まる

## Workspace tokens
`xoxa-`で始まる

## Legacy tokens

## Verification tokens