【问题标题】:google authorization not working on Apache hosted on AWS lightsail谷歌授权不适用于 AWS lightsail 上托管的 Apache
【发布时间】:2018-04-10 19:45:46
【问题描述】:

试图找到解决方案,失败了! :-(

我在具有蓝图授权的烧瓶应用程序上创建了一个小型 python。在 VM 中的 localhost 上一切正常,但在部署到 Apache AWS lightsail 后立即变成了一个野孩子。

这里有两个问题, 1)清除浏览器历史记录后,登录我的应用程序导致 500 内部服务器指向 user.py 中的 google_authorized 函数(无效的 google 响应)。第一次登录失败后登录没有问题。

error.log

rv = self.dispatch_request() 文件“/var/www/catalog/venv/lib/python3.5/site-packages/flask/app.py”,第 1598 行,在 dispatch_request 返回 self.view_functionsrule.endpoint

文件“/var/www/catalog/webapp/login/user.py”,第 42 行,在 google_authorized 中

resp = google.authorized_response()

文件“/var/www/catalog/venv/lib/python3.5/site-packages/flask_oauthlib/client.py”,第 677 行,在 authorized_response 数据 = self.handle_oauth2_response()

文件“/var/www/catalog/venv/lib/python3.5/site-packages/flask_oauthlib/client.py”,第 664 行,在 handle_oauth2_response type='invalid_response', data=data

flask_oauthlib.client.OAuthException:来自谷歌的无效响应

2) CRUD 按钮导致另一个 500 内部服务器。

Error.log

return appctx.app.handle_url_build_error(error, endpoint, values), referer: xxxx.com/login/google_authorized?code=4/2wVp8IC1ICD8zTV_Th81CJSjDtvtCvpCOzPI0gPrxNQ

文件“/var/www/catalog/venv/lib/python3.5/site-packages/flask/app.py”,第 1805 行,在 handle_url_build_error 中,引用:xxxx.com/login/google_authorized?code=4 /2wVp8IC1ICD8zTV_Th81CJSjDtvtCvpCOzPI0gPrxNQ

werkzeug.routing.BuildError:无法为端点“登录”构建 url。您的意思是“login.login”吗?,referer:xxxx.com/login/google_authorized?code=4/2wVp8IC1ICD8zTV_Th81CJSjDtvtCvpCOzPI0gPrxNQ

==================

Tree List of Directories and Files


1) catalog.wsgi

with open(activator) as f:
exec(f.read(), {'__file__': activator})

import sys
import logging

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/catalog/")

from application import app as application

2) catalog.conf

<VirtualHost *:80>
            ServerName xxxx.xxx
            WSGIScriptAlias / /var/www/catalog/catalog.wsgi
            <Directory /var/www/catalog/>
                    Order allow,deny
                    Allow from all
            </Directory>
            Alias /static /var/www/catalog/webapp/static
            <Directory /var/www/catalog/webapp/static/>
                    Order allow,deny
                    Allow from all 
            </Directory>
            ErrorLog ${APACHE_LOG_DIR}/error.log 
            LogLevel warn
            CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

3) /webapp/app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_oauthlib.client import OAuth

app = Flask(__name__)

# production configuration
# app.config.from_pyfile('/var/www/catalog/config.py')
app.config.from_object('config')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

oauth = OAuth()

google = oauth.remote_app(
    'google',
    consumer_key=app.config.get('GOOGLE_CLIENT_ID'),
    consumer_secret=app.config.get('GOOGLE_CLIENT_SECRET'),
    request_token_params={
        'scope': 'email'
    },
    base_url='https://www.googleapis.com/oauth2/v1/',
    request_token_url=None,
    access_token_method='POST',
    access_token_url='https://accounts.google.com/o/oauth2/token',
    authorize_url='https://accounts.google.com/o/oauth2/auth',
)

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"  # set login view page

import webapp.models
import webapp.populate
import webapp.controllers
import webapp.forms

from webapp.login.user import user_login

app.register_blueprint(user_login)

db.create_all()

4) /webapp/controllers.py

from datetime import timedelta
from flask import request, render_template, flash, g, session, jsonify
from flask_login import login_required, current_user

from webapp.app import app
from webapp.forms import AddItem, EditItem, DeleteItem, AddCat, EditCat, flash_errors

from webapp.populate import insert_cat, update_cat, insert_item, update_item, delete_item, \
get_category, get_latest_items, get_item_by_cat, get_cat_for_item, get_all_items


@app.before_first_request
def initialize_user():
   session.permanent = True  # set permanent_session
   app.permanent_session_lifetime = timedelta(days=7)  # set 
   permanent_session valid for 7 days

   if current_user.is_authenticated:
       g.user = current_user
   else:
       g.user = None


 @app.route('/', methods=['GET'])
 def index():
 # Main page of Catalog App                                     #
 # boolHome is a passing parameter to indicate the              #
 # render template is either a home page or editable page       #
     return render_template('index.html',
                       catLists=get_category(), lateLists=get_latest_items(), boolHome='True')


 @app.route('/category/<string:name>/Items')
 def category(name):
 # Render template to display all items corresponding to the selected category
    return render_template('index.html', catLists=get_category(),
                       countCats=get_cat_for_item(name),
                       catItems=get_item_by_cat(name), 
                       boolHome='False', model='None')

 @app.route('/category/add', methods=['GET', 'POST'])
 @login_required
 def add_cat():
 # Render template to display all categories after creating a new category   #
 # modal is a passing parameter to either keep bootstrap modal open for      #
 # handling error events or render template for successful add/edit/delete   #
 form = AddCat(request.form)
 if request.method == 'POST' and form.validate():

    if insert_cat(form.name.data):
        return render_template('index.html', catLists=get_category(), boolHome='True', modal='None')
    else:
        flash('Failed to create a new category. Try Again!', 'error')
 else:
    flash_errors(form)

 return render_template('index.html', catLists=get_category(), lateLists=get_latest_items(), boolHome='True', form=form, modal='add-cat')

5) /webapp/login/user.py

 from flask import Blueprint, redirect, url_for, request, session
 from flask_login import logout_user

 from webapp.app import google, facebook, login_manager
 from webapp.login.models import User
 from webapp.login.populate import auth_user

 user_login = Blueprint("login", __name__)

 @login_manager.user_loader
 def load_user(id):
     user = User.query.filter_by(email=id).first()
     return user

 @user_login.route('/login/<string:api>')
 def login(api):
     if api == 'google':
         return 
     google.authorize(callback=url_for('login.google_authorized', _external=True))
     else:
         callback = url_for(
            'login.facebook_authorized', next=request.args.get('next')
                                          or request.referrer
                                          or None, _external=True
          )
    return facebook.authorize(callback=callback)


 @user_login.route("/logout")
 def logout():
     session.pop('facebook_token', None)
     session.pop('google_token', None)
     session.permanent = False
     logout_user()

     return redirect(url_for('index'))

 @user_login.route('/login/google_authorized')
 def google_authorized():
     resp = google.authorized_response()
     if resp is None:
          return 'Access denied: reason=%s error=%s' % (
              request.args['error_reason'],
              request.args['error_description']
     )
     session['google_token'] = (resp['access_token'], '')
     me = google.get('userinfo')
     return auth_user(me.data, 'google')

  @google.tokengetter
  def get_google_oauth_token():
       return session.get('google_token')

【问题讨论】:

    标签: python apache amazon-web-services flask


    【解决方案1】:

    “...推荐人:xxxx.com/login/google_authorized...”

    对于身份验证请求来说,这是一个奇怪的域。请检查应用程序配置和域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-20
      • 2023-03-03
      • 2018-08-07
      • 2018-09-19
      • 2021-09-25
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多