Dink0 commited on
Commit
87b1cf7
·
verified ·
1 Parent(s): 6fa5c94

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -0
app.py CHANGED
@@ -55,6 +55,81 @@ def main():
55
  `?code=...&device_id=...&state=...`
56
  """)
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  # Шаг 2: Обмен кода на токены
59
  st.markdown("### 2) Обмен кода на токены")
60
  user_code = st.text_input("Введите полный code, полученный из URL", value="")
 
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="")