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

<span>import</span> <span>functools</span>
<span>import</span> <span>pdb</span>
<span>import</span> <span>slack</span>
<span>from</span> <span>flask</span> <span>import</span> <span>(</span>
<span>Blueprint</span><span>,</span> <span>flash</span><span>,</span> <span>g</span><span>,</span> <span>redirect</span><span>,</span> <span>render_template</span><span>,</span> <span>request</span><span>,</span> <span>session</span><span>,</span> <span>url_for</span>
<span>)</span>
<span>from</span> <span>app.db</span> <span>import</span> <span>(</span>
<span>search_user</span><span>,</span> <span>register_user</span><span>,</span> <span>search_team</span><span>,</span> <span>register_team</span><span>,</span> <span>search_team_user</span><span>,</span> <span>register_team_user</span>
<span>)</span>
<span>bp</span> <span>=</span> <span>Blueprint</span><span>(</span><span>'auth'</span><span>,</span> <span>__name__</span><span>,</span> <span>url_prefix</span><span>=</span><span>'/auth'</span><span>)</span>
<span>client_id</span> <span>=</span> <span>'XXXXXXXXXXXXXXX'</span>
<span>client_secret</span> <span>=</span> <span>'XXXXXXXXXXXXXXX'</span>
<span>oauth_scope</span> <span>=</span> <span>'channels:read,chat:write:bot,users:read,users:read.email'</span>
<span>import</span> <span>functools</span>
<span>import</span> <span>pdb</span>
<span>import</span> <span>slack</span>

<span>from</span> <span>flask</span> <span>import</span> <span>(</span>
    <span>Blueprint</span><span>,</span> <span>flash</span><span>,</span> <span>g</span><span>,</span> <span>redirect</span><span>,</span> <span>render_template</span><span>,</span> <span>request</span><span>,</span> <span>session</span><span>,</span> <span>url_for</span>
<span>)</span>

<span>from</span> <span>app.db</span> <span>import</span> <span>(</span>
    <span>search_user</span><span>,</span> <span>register_user</span><span>,</span> <span>search_team</span><span>,</span> <span>register_team</span><span>,</span> <span>search_team_user</span><span>,</span> <span>register_team_user</span>
<span>)</span>

<span>bp</span> <span>=</span> <span>Blueprint</span><span>(</span><span>'auth'</span><span>,</span> <span>__name__</span><span>,</span> <span>url_prefix</span><span>=</span><span>'/auth'</span><span>)</span>
<span>client_id</span> <span>=</span> <span>'XXXXXXXXXXXXXXX'</span>
<span>client_secret</span> <span>=</span> <span>'XXXXXXXXXXXXXXX'</span>
<span>oauth_scope</span> <span>=</span> <span>'channels:read,chat:write:bot,users:read,users:read.email'</span>
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.

<span>@</span><span>bp</span><span>.</span><span>route</span><span>(</span><span>'/redirect'</span><span>,</span> <span>methods</span><span>=</span><span>[</span><span>'GET'</span><span>])</span>
<span>def</span> <span>authorize</span><span>():</span>
<span>authorize_url</span> <span>=</span> <span>f</span><span>"https://slack.com/oauth/authorize?scope=</span><span>{</span> <span>oauth_scope</span> <span>}</span><span>&client_id=</span><span>{</span> <span>client_id</span> <span>}</span><span>"</span>
<span>return</span> <span>redirect</span><span>(</span><span>authorize_url</span><span>)</span>
<span>@</span><span>bp</span><span>.</span><span>route</span><span>(</span><span>'/redirect'</span><span>,</span> <span>methods</span><span>=</span><span>[</span><span>'GET'</span><span>])</span>
<span>def</span> <span>authorize</span><span>():</span>
    <span>authorize_url</span> <span>=</span> <span>f</span><span>"https://slack.com/oauth/authorize?scope=</span><span>{</span> <span>oauth_scope</span> <span>}</span><span>&client_id=</span><span>{</span> <span>client_id</span> <span>}</span><span>"</span>

    <span>return</span> <span>redirect</span><span>(</span><span>authorize_url</span><span>)</span>
@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

<span>@</span><span>bp</span><span>.</span><span>route</span><span>(</span><span>'/callback'</span><span>,</span> <span>methods</span><span>=</span><span>[</span><span>"GET"</span><span>,</span> <span>"POST"</span><span>])</span>
<span>def</span> <span>callback</span><span>():</span>
<span>auth_code</span> <span>=</span> <span>request</span><span>.</span><span>args</span><span>[</span><span>'code'</span><span>]</span>
<span>client</span> <span>=</span> <span>slack</span><span>.</span><span>WebClient</span><span>(</span><span>token</span><span>=</span><span>""</span><span>)</span>
<span>oauth_info</span> <span>=</span> <span>client</span><span>.</span><span>oauth_access</span><span>(</span>
<span>client_id</span><span>=</span><span>client_id</span><span>,</span>
<span>client_secret</span><span>=</span><span>client_secret</span><span>,</span>
<span>code</span><span>=</span><span>auth_code</span>
<span>)</span>
<span>@</span><span>bp</span><span>.</span><span>route</span><span>(</span><span>'/callback'</span><span>,</span> <span>methods</span><span>=</span><span>[</span><span>"GET"</span><span>,</span> <span>"POST"</span><span>])</span>
<span>def</span> <span>callback</span><span>():</span>
    <span>auth_code</span> <span>=</span> <span>request</span><span>.</span><span>args</span><span>[</span><span>'code'</span><span>]</span>
    <span>client</span> <span>=</span> <span>slack</span><span>.</span><span>WebClient</span><span>(</span><span>token</span><span>=</span><span>""</span><span>)</span>
    <span>oauth_info</span> <span>=</span> <span>client</span><span>.</span><span>oauth_access</span><span>(</span>
        <span>client_id</span><span>=</span><span>client_id</span><span>,</span>
        <span>client_secret</span><span>=</span><span>client_secret</span><span>,</span>
        <span>code</span><span>=</span><span>auth_code</span>
    <span>)</span>
@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.

<span>access_token</span> <span>=</span> <span>oauth_info</span><span>[</span><span>'access_token'</span><span>]</span>
<span>client</span> <span>=</span> <span>slack</span><span>.</span><span>WebClient</span><span>(</span><span>token</span><span>=</span><span>access_token</span><span>)</span>
<span>user_id</span> <span>=</span> <span>oauth_info</span><span>[</span><span>'user_id'</span><span>]</span>
<span>response</span> <span>=</span> <span>client</span><span>.</span><span>users_info</span><span>(</span><span>user</span><span>=</span><span>user_id</span><span>)</span>
   <span>access_token</span> <span>=</span> <span>oauth_info</span><span>[</span><span>'access_token'</span><span>]</span>
   <span>client</span> <span>=</span> <span>slack</span><span>.</span><span>WebClient</span><span>(</span><span>token</span><span>=</span><span>access_token</span><span>)</span>
   <span>user_id</span> <span>=</span> <span>oauth_info</span><span>[</span><span>'user_id'</span><span>]</span>
   <span>response</span> <span>=</span> <span>client</span><span>.</span><span>users_info</span><span>(</span><span>user</span><span>=</span><span>user_id</span><span>)</span>
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.

原文链接:How to integrate with Slack OAuth in Flask

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
Don't give up just because of what people said. Use that as your motivation to push harder.
别因为别人说的话而放弃,把那些话当做加倍努力的动力
评论 抢沙发

请登录后发表评论

    暂无评论内容