dan*_*how 5 heroku flask python-3.x google-oauth google-oauth2
根据brijieshb42的使用requests_oauthlib 的文章,开发供公司内部使用的Flask应用程序(Python3 / Heroku),并成功实现了Google Login(Oauth2)。
研究表明,如果我在授权URL中传递参数“ hd”(托管域),则可以解决问题。例如
https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=OUR_CLIENT_ID&redirect_uri=https%3A%2F%2FOUR_APP.herokuapp.com%2Fconnect&scope=profile+email&state=STATE&hd = our_google_apps_domain.com&access_type = offline
我的理解是,此参数应提供客户端限制,并且仅允许基于Google文档,此邮件列表帖子和以下stackoverflow帖子使用来自Google Apps域的电子邮件登录(服务器端,我将在此之后处理!):post1,post2。
但是,尽管我的代码生成了我上面粘贴的授权URL,但是我仍然可以使用我的个人gmail帐户(@ gmail.com与@our apps domain.com)登录。
任何人都可以阐明为什么它不起作用吗?还是提供不同的方法?基本上,宁愿阻止非员工登录。
我可以根据需要共享代码,但是几乎可以从brijeshb42文章中粘贴出来,并且基本上是这样的:
OAuth2Session(
OUR_CLIENT_ID,
redirect_uri=https://OUR_APP.herokuapp.com/connect,
scope=['profile', 'email']).authorization_url(
https://accounts.google.com/o/oauth2/auth,
hd='our_google_apps_domain.com',
access_type='offline')
Run Code Online (Sandbox Code Playgroud)
哪个返回我上面粘贴的身份验证网址!
小智 2
身份验证成功后,您必须自行检查提供的电子邮件。我已经添加了您引用的我的文章中的代码片段。我在评论后添加了所需的额外检查。
@app.route('/gCallback')
def callback():
# Redirect user to home page if already logged in.
if current_user is not None and current_user.is_authenticated():
return redirect(url_for('index'))
if 'error' in request.args:
if request.args.get('error') == 'access_denied':
return 'You denied access.'
return 'Error encountered.'
if 'code' not in request.args and 'state' not in request.args:
return redirect(url_for('login'))
else:
# Execution reaches here when user has
# successfully authenticated our app.
google = get_google_auth(state=session['oauth_state'])
try:
token = google.fetch_token(
Auth.TOKEN_URI,
client_secret=Auth.CLIENT_SECRET,
authorization_response=request.url)
except HTTPError:
return 'HTTPError occurred.'
google = get_google_auth(token=token)
resp = google.get(Auth.USER_INFO)
if resp.status_code == 200:
user_data = resp.json()
email = user_data['email']
"""
Your Domain specific check will come here.
"""
if email.split('@')[1] != 'domain.com':
flash('You cannot login using this email', 'error')
return redirect(url_for('login'))
user = User.query.filter_by(email=email).first()
if user is None:
user = User()
user.email = email
user.name = user_data['name']
print(token)
user.tokens = json.dumps(token)
user.avatar = user_data['picture']
db.session.add(user)
db.session.commit()
login_user(user)
return redirect(url_for('index'))
return 'Could not fetch your information.'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1450 次 |
| 最近记录: |