-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoauth_server.py
67 lines (48 loc) · 2.12 KB
/
oauth_server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from flask import Flask, request, redirect
from slack_bolt.app.async_app import AsyncApp
from api.google_api import GoogleService
from blocks.meet import help_message_block
from data.config import FLASK_SECRET_KEY, OAUTH_URL, SLACK_CONFIG, SLACK_SCOPES
from utils.dbworker import get_user_for_state, set_user_credentials, delete_redirect_uri, set_user_slack_token
from utils.logging import slack_logging
from utils.slack_help import run_with_ngrok, slack_oauth_link
app = Flask(__name__)
app.secret_key = FLASK_SECRET_KEY
@app.route('/oauth2callback/google')
async def oauth_google():
state = request.args.get('state', '')
if user := await get_user_for_state(state):
service = GoogleService()
service.creds.redirect_uri = OAUTH_URL() + '/google'
service.auth(request.url.replace('http', 'https'))
await set_user_credentials(user.user_id, service.creds.credentials)
url = slack_oauth_link(
user_scopes=SLACK_SCOPES['user_scopes'],
state=state
)
return redirect(url)
return redirect('slack://')
@app.route('/oauth2callback/slack')
async def oauth_slack():
if user := await get_user_for_state(request.args.get('state')):
slack_app = AsyncApp(token=SLACK_CONFIG['bot_token'])
response = await slack_app.client.oauth_v2_access(
code=request.args.get('code'),
client_secret=SLACK_CONFIG['client_secret'],
client_id=SLACK_CONFIG['client_id'],
redirect_uri=OAUTH_URL().replace('http:', 'https:') + '/slack'
)
await set_user_slack_token(
user_id=response['authed_user']['id'],
token=response['authed_user']['access_token']
)
await delete_redirect_uri(user.user_id)
app_slack = AsyncApp(token=user.slack_token)
await app_slack.client.chat_postMessage(
channel=user.user_id,
blocks=help_message_block()
)
slack_logging.info(f"User {user.user_id} authorize")
return redirect('slack://')
if __name__ == "__main__":
run_with_ngrok(app.run, 5000, region='eu', save_url='etc/oauth-server')