Проблемы с установкой специального бота Slack в существующую рабочую областьPython

Программы на Python
Anonymous
Проблемы с установкой специального бота Slack в существующую рабочую область

Сообщение Anonymous »

Я столкнулся с несколькими проблемами при установке специального бота Slack в существующее рабочее пространство и не знаю, как их решить. Вот моя ситуация:
  • Контекст рабочего пространства: я являюсь частью рабочего пространства Slack, которое я не создавал. Администратор рабочей области предоставил мне необходимые разрешения для установки приложений.
  • Разработка ботов: я разработал бота Slack и не собираюсь распространять его публично. Этот бот предназначен исключительно для использования в нашем текущем рабочем пространстве.
  • Попытки установки:
  • Когда я пытаюсь добавить бота с помощью кнопки «Добавить в Slack» из каталога приложения Slack или с помощью общего URL-адреса, я сталкиваюсь с проблемами, связанными с неправильной обработкой параметра состояния.
  • Я получаю сообщение об ошибке: Неверный параметр состояния.
  • Ниже приведен мой текущий код:

Код: Выделить всё

# SlackBotApp.py
import os
from flask import Flask, request, Response, redirect, session
import json
import logging
from slack_bolt import App, BoltResponse
from slack_bolt.adapter.flask import SlackRequestHandler
from slack_bolt.oauth.callback_options import CallbackOptions, SuccessArgs, FailureArgs
from slack_bolt.oauth.oauth_settings import OAuthSettings
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
from slack_sdk.oauth.installation_store import FileInstallationStore
from slack_sdk.oauth.state_store import FileOAuthStateStore
import uuid
import Constants
from SlashCommand import SlashCommand

class SlackBotApp:
def __init__(self):
installation_store_dir = "./data/installations"
state_store_dir = "./data/states"

oauth_settings = OAuthSettings(
client_id=Constants.SLACK_CLIENT_ID,
client_secret=Constants.SLACK_CLIENT_SECRET,
scopes=["commands", "chat:write", "files:read", "files:write"],
installation_store=FileInstallationStore(base_dir=installation_store_dir),
state_store=FileOAuthStateStore(base_dir=state_store_dir, expiration_seconds=600),
redirect_uri=Constants.SLACK_REDIRECT_URI,
install_path="/begin_auth",
redirect_uri_path="/finish_auth",
callback_options=CallbackOptions(success=self.oauth_success, failure=self.oauth_failure)
)

self.slack_app = App(
signing_secret=Constants.SLACK_SIGNING_SECRET,
oauth_settings=oauth_settings
)

SlashCommand(self.slack_app)
self.handler = SlackRequestHandler(self.slack_app)

self.flask_app = Flask(__name__)
self.flask_app.secret_key = Constants.FLASK_SECRET_KEY or str(uuid.uuid4())
self.setup_routes()

def oauth_success(self, args: SuccessArgs) -> BoltResponse:
return args.default.success(args)

def oauth_failure(self, args: FailureArgs) ->  BoltResponse:
return args.default.failure(args)

def setup_routes(self):
@self.flask_app.route('/')
def home():
return "Hello, this is the Slack Bot home page."

@self.flask_app.route('/slack/events', methods=['POST'])
def slack_events():
return self.handler.handle(request)

@self.flask_app.route('/slack/oauth_redirect', methods=['GET'])
def oauth_redirect():
code = request.args.get('code')
state = request.args.get('state')
if not code or not state or state != session.pop('state', None):
return "Invalid state parameter", 400
return self.handler.handle(request)

@self.flask_app.route('/slack', methods=['POST'])
def slack_challenge():
payload = request.get_data()
data = json.loads(payload)
return Response(data["challenge"], mimetype='application/x-www-form-urlencoded')

@self.flask_app.route('/slack/install', methods=['GET'])
def install():
state = str(uuid.uuid4())
session['state'] = state
oauth_url = f"https://slack.com/oauth/v2/authorize?client_id={Constants.SLACK_CLIENT_ID}&scope=commands,chat:write,files:read,files:write&state={state}&redirect_uri={Constants.SLACK_REDIRECT_URI}"
return redirect(oauth_url)

@self.flask_app.route('/begin_auth', methods=['GET'])
def begin_auth():
state = str(uuid.uuid4())
session['state'] = state
client_id = Constants.SLACK_CLIENT_ID
redirect_uri = Constants.SLACK_REDIRECT_URI
oauth_url = f"https://slack.com/oauth/v2/authorize?scope=commands,chat:write,files:read,files:write&client_id={client_id}&state={state}&redirect_uri={redirect_uri}"
return redirect(oauth_url)

@self.flask_app.route('/finish_auth', methods=['GET'])
def finish_auth():
code = request.args.get('code')
state = request.args.get('state')
if not code or not state or state != session.pop('state', None):
return "Invalid state parameter", 400

client_id = Constants.SLACK_CLIENT_ID
client_secret = Constants.SLACK_CLIENT_SECRET
client = WebClient()
try:
response = client.oauth_v2_access(
client_id=client_id,
client_secret=client_secret,
code=code,
redirect_uri=Constants.SLACK_REDIRECT_URI
)
Constants.SLACK_BOT_TOKEN = response['access_token']
return "Auth complete!"
except SlackApiError as e:
return f"Error: {e.response['error']}", 400

@self.flask_app.route('/slack/command', methods=['POST'])
def command():
return self.handler.handle(request)

def run(self):
self.flask_app.run(host='0.0.0.0', port=3000)

if __name__ == "__main__":
app = SlackBotApp()
app.run()
  • Проблемы с параметрами состояния:
  • Когда я пытаюсь установить приложение через общий URL-адрес, я получаю сообщение об ошибке: Неверный параметр состояния.
  • Похоже, что параметр состояния обрабатывается неправильно. Это происходит потому, что я пытаюсь установить его самостоятельно, а не поручить это администратору?
  • Обработка OAuth:
  • Правильно ли я обрабатываю перенаправление OAuth и параметр состояния в своем коде?
  • Доступ для соавторов:
  • Если я добавлю администратора рабочей области в качестве соавтора в своем приложении, и он установит его напрямую, решит ли это проблему?
  • Текущее поведение:
  • При попытке принудительно добавить приложение и попробовать команды с косой чертой, в журналах сервера показано:

Код: Выделить всё

"GET /favicon.ico HTTP/1.0" 404 -
Although the app should be installed into this workspace, the AuthorizeResult (returned value from authorize) for it was not found.
  • Поведение страницы установки:
  • Когда я захожу на сайт my-domain.com/slack/install, отображается экран запроса разрешений, а после предоставления разрешений возникает ошибка «Не найдено». Чем это отличается от использования общего URL-адреса?
Как правильно установить бота Slack в нашу рабочую область, гарантируя правильную обработку параметра состояния и бот работает как задумано?


Подробнее здесь: https://stackoverflow.com/questions/786 ... -workspace

Вернуться в «Python»