Help us understand the problem. What is going on with this article?

FlaskでSlack認証を完了するまでの流れ(Python)

FlaskでSlack認証を実装してみました。大体は、公式のドキュメントを見れば通るのですが、認証すると同時にユーザー情報も取得したいみたいな時にやや戸惑った部分もあるので、備忘録も兼ねて残しておきます。

前提

Slackアプリの登録については前回詳しく流れを書いています。
https://qiita.com/svfreerider/items/0e1fe74c70e2047f0ce9

ほとんどは下記の公式ドキュメントのコードのまんまです。
https://slack.dev/python-slackclient/auth.html

ソースコード

auth.py
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_idclient_secretを定義します。また、これに加えてscopeを定義します。scopeは、今回のアプリを作るにおいてユーザーに求める権限の範囲を指定します。アプリ側でも設定しておく必要があります。また、申請する際には「なぜ、このscopeが必要か」の理由を書かなければなりません。

自分の場合は、ボットを作ってそこから通知を送るので、チャンネルを指定するchannels:readと、chat:write:botを加えました。それから、あとでユーザーの個人情報と、メールアドレスも欲しいので、users:readusers:read.emailも入れておきました。

auth.py
@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の認証画面へリダイレクトされます。

auth.py
@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を使ってユーザーの詳細情報を別で呼んでいきます。

auth.py
    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でアプリを作るケースは確実に増えていくと思うので、随時共有していくようにします。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした