2016-06-10 4 views
2

Привет, это мой текущий код на Python для аутентификации в моем веб-приложении.Аутентифицировать пользователя с определенным доменом (hd) в Flask с Oauth2

auth_flow = OAuth2WebServerFlow(client_id=AUTH_CLIENT_ID, 
           client_secret=AUTH_CLIENT_SECRET, 
           scope=AUTH_PLUS_SCOPE, 
           redirect_uri=AUTH_CALLBACK_URI) 

AUTH_ARGS = { 
    'error': fields.Str(), 
    'code': fields.Str() 
} 


@auth_api.route('/', methods=['GET']) 
def get_auth_uri(): 
    if current_user and current_user.is_authenticated: 
     return redirect(LOGIN_PATH) 
    else: 
     auth_uri = auth_flow.step1_get_authorize_url() 
     return redirect(auth_uri) 


@auth_api.route('/oauth2callback', methods=['GET']) 
@use_kwargs(AUTH_ARGS) 
def oauth2_callback(error, code): 
    if error: 
     return redirect(url_for('login'), code=HTTPStatus.TEMPORARY_REDIRECT) 
    else: 
     try: 
      authenticate(code) 
      return redirect(LOGIN_PATH) 
     except Unauthorized: 
      raise APIError(HTTPStatus.UNAUTHORIZED, AUTH_FAILED_MESSAGE) 


@auth_api.route('/me', methods=['GET']) 
@login_required 
def get_current_user(): 
    return jsonify(current_user.serialized) 


@auth_api.route('/logout') 
@login_required 
def logout(): 
    logout_user() 
    return redirect(url_for('login')) 



def authenticate(code): 
    try: 
     credentials = _get_credentials(code) 
     user = User.get_or_create(credentials) 
     login_user(user) 
    except FlowExchangeError: 
     raise Unauthorized() 


def _get_credentials(code): 
    return auth_flow.step2_exchange(code) 

Однако, сейчас мое приложение принимает логин с любого адреса учетной записи google. Я хотел бы ограничить доступ к логину для пользователя с указанным доменом, например [email protected] Я видел несколько ответов с параметрами hd, но я не знаю, как его использовать.

ответ

1

Параметр HD может быть установлен путем добавления его к auth_uri следующим

auth_uri = GOOGLE_AUTH_URI 
auth_uri = auth_uri + '?hd=' + 'example.com' 

auth_flow = OAuth2WebServerFlow(client_id=AUTH_CLIENT_ID, 
          client_secret=AUTH_CLIENT_SECRET, 
          scope=AUTH_PLUS_SCOPE, 
          redirect_uri=AUTH_CALLBACK_URI, 
          auth_uri=auth_uri, 
          ) 

Однако в моем опыте параметр HD не ограничивает пользователей с различными адресами электронной почты от входа. Вы всегда должны проверить учетные данные ,

def authenticate(code): 
    try: 
     credentials = _get_credentials(code) 
     if not credentials.id_token['email'].endswith('@example.com') 
      # abort(401) 
      raise Unauthorized() 
     user = User.get_or_create(credentials) 
     login_user(user) 
    except FlowExchangeError: 
     raise Unauthorized() 
+0

Отлично, мне уже удалось добавить вторую часть кода в аутентификацию, но всегда лучше проверить его дважды. Спасибо за ответ. Я отвечу на ваш ответ, как только я получу достаточную репутацию! –

+1

Знаете ли вы, почему мой вопрос не поддерживается? Я пытаюсь задать хороший вопрос, но никто его не повысит. –

Смежные вопросы