DEV Community

Shun Yamada
Shun Yamada

Posted on

How to integrate with Slack OAuth in Flask

I tried to integrate with Slack OAuth in Flask. Actually, you can make it easy to understand once you read an official document I assume. But some errors occurred to me then, for example, to get user details. So here it is a tutorial to authenticate successfully.

Reference

If you knew more about Slack App, please check this out. I wrote about it before.
https://dev.to/shyamady/how-to-publish-slack-app-using-rails-5hlm

An official doc
https://slack.dev/python-slackclient/auth.html

Code

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'
Enter fullscreen mode Exit fullscreen mode

Define client_id and client_secret initially. In addition, you need to put scope here. scope should be included what you request for users. Not only for the app, but you also need to register ones on Slack App. You suppose to write why you need these scopes when submitting.

In this case, I added channels:read and chat:write:bot to this. Also, it's necessary to set users:read and users:read.email for fetching users detail.

@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)
Enter fullscreen mode Exit fullscreen mode

See /auth/redirect

@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
    )
Enter fullscreen mode Exit fullscreen mode

After the callback, then move right along. You can get basic information with oauth_access.

However, this response is not supposed to include personal information like username, email, and etc.

   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)
Enter fullscreen mode Exit fullscreen mode

users_info with access_token leads you to get almost all user's information like username, email, icon, and timezone.

I hope you can use this code in Django or other Python frameworks. As I am a Rails engineer, there're not too many references concerns for Flask.

But I believe it will be increasing its number with Machine Learning potentiality.

Top comments (0)