Приложение Azure Python flask - проблема аутентификации AD - PullRequest
3 голосов
/ 28 июня 2019

Это может быть немного сложно объяснить, поэтому постараюсь.

Текущее решение

У меня есть приложение на фляге Python, которое будет развернуто в службе приложений в Azure. Я хочу, чтобы пользователь вошел в службу приложений с помощью аутентификации Azure AD. Для этого я использую библиотеку ADAL, так как я нашел некоторый код, который работает для этого.

Я зарегистрировал приложение в Azure AD, чтобы получить идентификатор приложения и секретный ключ приложения. Для этого я использовал этот урок: https://docs.microsoft.com/en-gb/azure/active-directory/develop/quickstart-configure-app-access-web-apis#add-redirect-uris-to-your-application

app.py

import os
import urllib.parse
import uuid

import adal
import flask
import requests

import config
import logging

os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' # enable non-HTTPS for testing

APP = flask.Flask(__name__, template_folder='static/templates')
APP.debug = True
APP.secret_key = 'development'
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

SESSION = requests.Session()

@APP.route('/')
def homepage():
    """Render the home page."""
    logging.info('test')
    logger.debug("test1")
    return flask.render_template('homepage.html', sample='ADAL')

@APP.route('/login')
def login():
    """Prompt user to authenticate."""
    auth_state = str(uuid.uuid4())
    SESSION.auth_state = auth_state

    # For this sample, the user selects an account to authenticate. Change
    # this value to 'none' for "silent SSO" behavior, and if the user is
    # already authenticated they won't need to re-authenticate.
    prompt_behavior = 'select_account'

    params = urllib.parse.urlencode({'response_type': 'code',
                                     'client_id': config.CLIENT_ID,
                                     'redirect_uri': config.REDIRECT_URI,
                                     'state': auth_state,
                                     'resource': config.RESOURCE,
                                     'prompt': prompt_behavior})

    return flask.redirect(config.AUTHORITY_URL + '/oauth2/authorize?' + params)

@APP.route('/login/authorized')
def authorized():
    """Handler for the application's Redirect Uri."""
    code = flask.request.args['code']
    auth_state = flask.request.args['state']
    if auth_state != SESSION.auth_state:
        raise Exception('state returned to redirect URL does not match!')
    auth_context = adal.AuthenticationContext(config.AUTHORITY_URL, api_version=None)
    token_response = auth_context.acquire_token_with_authorization_code(
        code, config.REDIRECT_URI, config.RESOURCE, config.CLIENT_ID, config.CLIENT_SECRET)
    SESSION.headers.update({'Authorization': f"Bearer {token_response['accessToken']}",
                            'User-Agent': 'adal-sample',
                            'Accept': 'application/json',
                            'Content-Type': 'application/json',
                            'SdkVersion': 'sample-python-adal',
                            'return-client-request-id': 'true'})
    return flask.redirect('/graphcall')

@APP.route('/graphcall')
def graphcall():
    """Confirm user authentication by calling Graph and displaying some data."""
    endpoint = config.RESOURCE + config.API_VERSION + '/me'
    http_headers = {'client-request-id': str(uuid.uuid4())}
    graphdata = SESSION.get(endpoint, headers=http_headers, stream=False).json()
    return flask.render_template('graphcall.html',
                                 graphdata=graphdata,
                                 endpoint=endpoint,
                                 sample='ADAL')

if __name__ == '__main__':
    APP.run(debug=True)
    APP.run()

config.py

CLIENT_ID = 'd****************************'
CLIENT_SECRET = 'D******************************'
REDIRECT_URI = 'http://localhost:5000/login/authorized'

# AUTHORITY_URL ending determines type of account that can be authenticated:
# /organizations = organizational accounts only
# /consumers = MSAs only (Microsoft Accounts - Live.com, Hotmail.com, etc.)
# /common = allow both types of accounts
AUTHORITY_URL = 'https://login.microsoftonline.com/common'

AUTH_ENDPOINT = '/oauth2/v2.0/authorize'
TOKEN_ENDPOINT = '/oauth2/v2.0/token'

RESOURCE = 'https://graph.microsoft.com/'
API_VERSION = 'v1.0'
SCOPES = ['User.Read'] # Add other scopes/permissions as needed.


# This code can be removed after configuring CLIENT_ID and CLIENT_SECRET above.
if 'ENTER_YOUR' in CLIENT_ID or 'ENTER_YOUR' in CLIENT_SECRET:
    print('ERROR: config.py does not contain valid CLIENT_ID and CLIENT_SECRET')
    import sys
    sys.exit(1)

В настоящее время при входе в приложение мне предоставляется экран входа в систему, с помощью которого я могу войти в систему, я думаю, что передается на экран пароля моей организации для входа в систему. После этого приложение не может получить токен на предъявителя. который затем перенаправляет приложение обратно на домашнюю страницу.

Вопросы

  • Есть ли способ, при котором мне не нужно использовать авторизацию Azure AD для службы приложений, и я могу просто авторизоваться с помощью Azure AD без нее.
  • Какой лучший способ сделать это.

Или я могу пройти аутентификацию в Azure AD, не используя библиотеку ADAL и не используя встроенную авторизацию Azure AD для входа в службу приложения моей фляги.

Я понимаю, что это не может быть объяснено очень хорошо, поэтому любые вопросы или дополнительную информацию, пожалуйста, дайте мне знать

Заранее спасибо.

1 Ответ

1 голос
/ 01 июля 2019

Если я правильно понимаю ваш вопрос, вам лучше использовать встроенную аутентификацию Azure AD, чем библиотеку ADAL.

Очень удобно использовать встроенную аутентификацию Azure AD, если вы просто хотите использовать функцию входа в систему, вам не нужно изменять свой код. Но если вы хотите получить токен доступа, вам нужно собрать его самостоятельно.

Как получить токен доступа?

Из кода вашего сервера токены, относящиеся к провайдеру, вводятся в заголовок запроса , поэтому вы можете легко получить к ним доступ.

Служба приложений предоставляет встроенное хранилище токенов , которое является хранилище токенов, которые связаны с пользователями вашей сети приложения, но вы должны написать код для сбора, хранения и обновления этих токены в вашем приложении.

Обновление:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...