LoginSignup
2
2

More than 3 years have passed since last update.

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

Posted at

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2