Как получить токен авторизации через OAuth2 и читать письма Outlook через http-запросы? - PullRequest
0 голосов
/ 18 января 2019

Я получаю свои электронные письма в Outlook, используя только запросы Python для получения конечной точки https://outlook.office365.com/api/v1.0/me/messages

Пример кода:

import requests

requests.get('https://outlook.office365.com/api/v1.0/me/messages', auth=(email, pwd))

Я бы вернул объект json, проанализировал его и получил содержимое моего электронного письма. Но теперь Microsoft устарела, и я пытался перейти на использование Microsoft Graph. Мой вопрос: как мне получить токен OAuth2 без необходимости запуска браузера с использованием http-запросов?

До сих пор я читал документы и зарегистрировал свое "приложение" (обычный скрипт на python) на портале регистрации приложений . Каждый раз, когда я сталкиваюсь, мне всегда приходится посещать URL-адрес авторизации, где я должен вручную входить через интерфейс пользовательского интерфейса, который выглядит следующим образом: outlook login Я хочу сделать это с помощью http-запросов / без внешнего интерфейса, но, похоже, я не могу найти ответы на вопросы, как это сделать.

Это код, который у меня пока есть:

outlook_test.py

import requests

authorize_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize'
token_url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'

payload = {
        'client_id': app_client_id, # Variable exists but not exposed in this question
        'response_type': 'code',
        'redirect_uri': 'https://login.microsoftonline.com/common/oauth2/nativeclient',
        'response_mode': 'form_post',
        'scope': 'mail.read',
        'state': '12345'
        }

r = requests.get(authorize_url, params=payload)
print(r.status_code)
print(r.text)

Вот что я получаю обратно:

200
<!DOCTYPE html>
<html dir="ltr" class="" lang="en">
<head>
    <title>Sign in to your account</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scal    able=yes">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="-1">
    <meta name="PageID" content="ConvergedSignIn" />
    <meta name="SiteID" content="" />
    <meta name="ReqLC" content="1033" />
    <meta name="LocLC" content="en-US" />

    <noscript>
        <meta http-equiv="Refresh" content="0; URL=https://login.microsoftonline.com/jsdisabled" />
    </noscript>


        <link rel="shortcut icon" href="https://secure.aadcdn.microsoftonline-p.com/ests/2.1.8502.8/co    ntent/images/favicon_a_eupayfgghqiai7k9sol6lg2.ico" />

    <meta name="robots" content="none" />
...

Это то, что у меня есть в настройках платформы, когда я зарегистрировал свое приложение, если это помогает: app platform settings screenshot

Можно ли как-нибудь получить код авторизации программно? Я также попытался передать параметр auth, но это не сработало.

Новые находки

Недавно я обнаружил, что запросы Python обрабатывают OAuth2, но теперь я получаю другую ошибку при попытке следовать их примерам . Это ошибка, которую я получаю:

  File "outlook_test.py", line 31, in <module>
    token = oauth.fetch_token(token_url=token_url, auth=auth)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\requests_oauthlib\oauth2_session.py", line 307, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\oauthlib\oauth2\rfc6749\clients\base.py", line 415, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\oauthlib\oauth2\rfc6749\parameters.py", line 425, in parse_token_response
    validate_token_parameters(params)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\oauthlib\oauth2\rfc6749\parameters.py", line 432, in validate_token_parameters
    raise_from_error(params.get('error'), params)
  File "C:\Users\ryee\Documents\gitLabQA\QA_BDD\outlook_env\lib\site-packages\oauthlib\oauth2\rfc6749\errors.py", line 405, in raise_from_error
    raise cls(**kwargs)
oauthlib.oauth2.rfc6749.errors.InvalidClientIdError: (invalid_request) AADSTS90014: The required field 'scope' is missing.
Trace ID: 2359d8a6-0140-43c1-8ff5-8103045d2f00
Correlation ID: dff39a1f-ffe1-493e-aea3-1536974b777d

Я пытался '[Mail.Read]' в качестве области, но я получаю «Неверный параметр Scope».

Мой новый скрипт на python:

outlook_test.py

from oauthlib.oauth2 import BackendApplicationClient
from requests.auth import HTTPBasicAuth
from requests_oauthlib import OAuth2Session
auth = HTTPBasicAuth(client_app_id, app_secret)
client = BackendApplicationClient(client_id=client_app_id)
oauth = OAuth2Session(client=client)
token = oauth.fetch_token(token_url=token_url, auth=auth)
...