FlaskでSlack認証を実装してみました。大体は、公式のドキュメントを見れば通るのですが、認証すると同時にユーザー情報も取得したいみたいな時にやや戸惑った部分もあるので、備忘録も兼ねて残しておきます。
前提
Slackアプリの登録については前回詳しく流れを書いています。
https://qiita.com/svfreerider/items/0e1fe74c70e2047f0ce9
ほとんどは下記の公式ドキュメントのコードのまんまです。
https://slack.dev/python-slackclient/auth.html
ソースコード
import functools
import pdb
import slack
from flask import (
Blueprint, flash, g, redirect, render_template, request, session, url_for
)
from app.db import (
search_user, register_user, search_team, register_team, search_team_user, register_team_user
)
bp = Blueprint('auth', __name__, url_prefix='/auth')
client_id = 'XXXXXXXXXXXXXXX'
client_secret = 'XXXXXXXXXXXXXXX'
oauth_scope = 'channels:read,chat:write:bot,users:read,users:read.email'
認証機能を実装していくauth.py
を用意します。Slackアプリを登録した際に取得したclient_id
とclient_secret
を定義します。また、これに加えてscope
を定義します。scopeは、今回のアプリを作るにおいてユーザーに求める権限の範囲を指定します。アプリ側でも設定しておく必要があります。また、申請する際には「なぜ、このscopeが必要か」の理由を書かなければなりません。
自分の場合は、ボットを作ってそこから通知を送るので、チャンネルを指定するchannels:read
と、chat:write:bot
を加えました。それから、あとでユーザーの個人情報と、メールアドレスも欲しいので、users:read
とusers:read.email
も入れておきました。
@bp.route('/redirect', methods=['GET'])
def authorize():
authorize_url = f"https://slack.com/oauth/authorize?scope={ oauth_scope }&client_id={ client_id }"
return redirect(authorize_url)
こうしておくと、/auth/redirect
へ移動することでSlackの認証画面へリダイレクトされます。
@bp.route('/callback', methods=["GET", "POST"])
def callback():
auth_code = request.args['code']
client = slack.WebClient(token="")
oauth_info = client.oauth_access(
client_id=client_id,
client_secret=client_secret,
code=auth_code
)
callback
した後に、URLの先についているcode
を使ってユーザーの情報を取得します。ユーザーの取得はoauth_access
で行なっています。
ですが、この時はまだユーザーの名前や、メールアドレスの情報は取れていません。今度は取得したoauth_token
を使ってユーザーの詳細情報を別で呼んでいきます。
access_token = oauth_info['access_token']
client = slack.WebClient(token=access_token)
user_id = oauth_info['user_id']
response = client.users_info(user=user_id)
users_info
でユーザーのメールアドレスや、名前だけでなくアイコン画像やタイムゾーンなど欲しい情報は全部取ってくることができます。
これはFlaskに限らず、Pythonであればそのまま流用できるかと思います。ちょうど2週間前にFlaskを入れてみたのですが、Railsを長年やってきた身としては、全然文献が見当たらないなというのが感想です。
これから、機械学習+Flaskでアプリを作るケースは確実に増えていくと思うので、随時共有していくようにします。