Dink0 commited on
Commit
1df9e6d
·
verified ·
1 Parent(s): a10e2b3

Delete tokapp.py

Browse files
Files changed (1) hide show
  1. tokapp.py +0 -180
tokapp.py DELETED
@@ -1,180 +0,0 @@
1
- import streamlit as st
2
- import requests
3
- import urllib.parse
4
- import hashlib
5
- import base64
6
- import secrets
7
-
8
- # Функции для генерации code_verifier и code_challenge
9
- def generate_code_verifier(length=128):
10
- return secrets.token_urlsafe(length)[:length]
11
-
12
- def generate_code_challenge(code_verifier):
13
- hashed = hashlib.sha256(code_verifier.encode('utf-8')).digest()
14
- return base64.urlsafe_b64encode(hashed).decode('utf-8').rstrip('=')
15
-
16
- # Основная функция
17
- def main():
18
- # Инициализация session_state для хранения code_verifier
19
- if 'code_verifier' not in st.session_state:
20
- st.session_state.code_verifier = generate_code_verifier()
21
-
22
- # Заголовок приложения
23
- st.title("VK ID Authorization with PKCE")
24
-
25
- # Параметры приложения
26
- client_id = 53202706 # Ваш client_id
27
- client_secret = "piaMXHEDj0afa4QObJCD" # Ваш client_secret
28
- redirect_uri = "https://huggingface.co/spaces/PRAnalytics/prtooltest" # Ваш redirect_uri
29
- scope = "wall" # Запрошенные разрешения
30
-
31
- # Генерация code_challenge на основе сохраненного code_verifier
32
- code_challenge = generate_code_challenge(st.session_state.code_verifier)
33
-
34
- # Отображение code_verifier и code_challenge (для отладки)
35
- st.write("code_verifier:", st.session_state.code_verifier)
36
- st.write("code_challenge:", code_challenge)
37
-
38
- # Шаг 1: Авторизация
39
- st.markdown("### 1) Авторизация")
40
- auth_params = {
41
- "client_id": client_id,
42
- "redirect_uri": redirect_uri,
43
- "response_type": "code",
44
- "scope": scope,
45
- "state": st.session_state.code_verifier, # Передаем code_verifier в параметре state
46
- "code_challenge": code_challenge,
47
- "code_challenge_method": "S256",
48
- "response_mode": "query"
49
- }
50
- auth_url = "https://id.vk.com/authorize?" + urllib.parse.urlencode(auth_params, safe="-._~")
51
- st.markdown(f"[Перейти к авторизации]({auth_url})")
52
-
53
- st.markdown("""
54
- После авторизации VK вернёт вас на redirect_uri с параметрами:
55
- `?code=...&device_id=...&state=...`
56
- """)
57
-
58
- # Шаг 2: Автоматическое извлечение параметров из URL
59
- query_params = st.experimental_get_query_params()
60
- user_code = query_params.get("code", [None])[0]
61
- user_device_id = query_params.get("device_id", [None])[0]
62
- user_state = query_params.get("state", [None])[0]
63
-
64
- # Если параметры есть, выполняем обмен кода на токены
65
- if user_code and user_state:
66
- st.write("Автоматически извлечены параметры из URL:")
67
- st.write(f"code: {user_code}")
68
- st.write(f"device_id: {user_device_id}")
69
- st.write(f"state: {user_state}")
70
-
71
- # Используем code_verifier из параметра state
72
- code_verifier = user_state
73
-
74
- url = "https://id.vk.com/oauth2/auth" # Endpoint для обмена токенов
75
- data = {
76
- "grant_type": "authorization_code",
77
- "client_id": client_id,
78
- "client_secret": client_secret,
79
- "redirect_uri": redirect_uri,
80
- "code": user_code,
81
- "code_verifier": code_verifier # Используем code_verifier из state
82
- }
83
- if user_device_id:
84
- data["device_id"] = user_device_id
85
-
86
- st.write("Отправляем запрос на:", url)
87
- st.write("Параметры запроса:", data)
88
-
89
- # Отправка запроса на обмен кода на токены
90
- resp = requests.post(url, data=data)
91
- st.write("Status code:", resp.status_code)
92
- st.write("Response text:", resp.text)
93
-
94
- try:
95
- tokens = resp.json()
96
- st.write("Ответ (JSON):")
97
- st.json(tokens)
98
-
99
- # Сохраняем токены и device_id в session_state
100
- st.session_state["VK_ACCESS_TOKEN"] = tokens["access_token"]
101
- st.session_state["VK_REFRESH_TOKEN"] = tokens["refresh_token"]
102
- st.session_state["VK_DEVICE_ID"] = user_device_id
103
- st.success("Токены успешно получены и сохранены!")
104
- except Exception as e:
105
- st.error(f"Ошибка при декодировании ответа: {e}")
106
- st.text(resp.text)
107
- else:
108
- st.warning("Параметры code, device_id и state не найдены в URL. Пройдите авторизацию.")
109
-
110
- # Если скрипт запущен напрямую, вызываем main()
111
- if __name__ == "__main__":
112
- main()
113
- # Шаг 1: Авторизация
114
- st.markdown("### 1) Авторизация")
115
- auth_params = {
116
- "client_id": client_id,
117
- "redirect_uri": redirect_uri,
118
- "response_type": "code",
119
- "scope": scope,
120
- "state": st.session_state.code_verifier, # Передаем code_verifier в параметре state
121
- "code_challenge": code_challenge,
122
- "code_challenge_method": "S256",
123
- "response_mode": "query"
124
- }
125
- auth_url = "https://id.vk.com/authorize?" + urllib.parse.urlencode(auth_params, safe="-._~")
126
- st.markdown(f"[Перейти к авторизации]({auth_url})")
127
-
128
- st.markdown("""
129
- После авторизации VK вернёт вас на redirect_uri с параметрами:
130
- `?code=...&device_id=...&state=...`
131
- """)
132
-
133
- # Шаг 2: Обмен кода на токены
134
- st.markdown("### 2) Обмен кода на токены")
135
- user_code = st.text_input("Введите полный code, полученный из URL", value="")
136
- user_device_id = st.text_input("Введите полный device_id, полученный из URL", value="")
137
- user_state = st.text_input("Введите state, полученный из URL", value="") # Поле для ввода state
138
-
139
- if user_code and user_state:
140
- if st.button("Обменять code"):
141
- # Используем code_verifier из параметра state
142
- code_verifier = user_state
143
-
144
- url = "https://id.vk.com/oauth2/auth" # Endpoint для обмена токенов
145
- data = {
146
- "grant_type": "authorization_code",
147
- "client_id": client_id,
148
- "client_secret": client_secret,
149
- "redirect_uri": redirect_uri,
150
- "code": user_code,
151
- "code_verifier": code_verifier # Используем code_verifier из state
152
- }
153
- if user_device_id:
154
- data["device_id"] = user_device_id
155
-
156
- st.write("Отправляем запрос на:", url)
157
- st.write("Параметры запроса:", data)
158
-
159
- # Отправка запроса на обмен кода на токены
160
- resp = requests.post(url, data=data)
161
- st.write("Status code:", resp.status_code)
162
- st.write("Response text:", resp.text)
163
-
164
- try:
165
- tokens = resp.json()
166
- st.write("Ответ (JSON):")
167
- st.json(tokens)
168
-
169
- # Сохраняем токены и device_id в session_state
170
- st.session_state["VK_ACCESS_TOKEN"] = tokens["access_token"]
171
- st.session_state["VK_REFRESH_TOKEN"] = tokens["refresh_token"]
172
- st.session_state["VK_DEVICE_ID"] = user_device_id
173
- st.success("Токены успешно получены и сохранены!")
174
- except Exception as e:
175
- st.error(f"Ошибка при декодировании ответа: {e}")
176
- st.text(resp.text)
177
-
178
- # Если скрипт запущен напрямую, вызываем main()
179
- if __name__ == "__main__":
180
- main()