Created
November 2, 2021 20:45
-
-
Save salrashid123/8ab5a2c382b3b314449113bee6a71292 to your computer and use it in GitHub Desktop.
Web oauth2 flow for cloud run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
from flask import Flask,redirect, session, request | |
import json | |
import os | |
import urllib | |
from urllib.request import urlopen | |
from oauth2client.file import Storage | |
from google_auth_oauthlib.flow import Flow | |
import google.oauth2.credentials | |
from google.auth.transport.requests import AuthorizedSession | |
from google.auth.credentials import AnonymousCredentials | |
import google.oauth2.credentials | |
from google.oauth2 import id_token | |
import google.auth | |
import google.auth.transport.requests | |
from google.auth.transport.requests import requests | |
# web client id from project=248066739582 whichis where https://myapp-jyosxg6puq-uc.a.run.app exits | |
scopes = 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile' | |
redirect_uri='https://notebook.esodemoapp2.com:8081/callback' | |
client_id='248066739582-h498t6035hm9lvp5u9jelm8i67rp43vq.apps.googleusercontent.com' | |
client_secret='redacted' | |
app = Flask(__name__) | |
SESSION_TYPE = "memory" | |
app.config.update(SECRET_KEY=os.urandom(24)) | |
@app.route("/") | |
def main(): | |
if 'username' in session: | |
username = session['username'] | |
return ('Logged in as ' + username + '<br>') | |
rdr = ('https://accounts.google.com/o/oauth2/auth?scope=' + urllib.parse.quote(scopes) + '&state=%2Fprofile&redirect_uri=' + urllib.parse.quote(redirect_uri) + '&response_type=code&client_id='+ client_id) | |
return redirect(rdr, code=302) | |
# Step 2: User authorization, this happens on the provider. | |
@app.route("/callback", methods=["GET"]) | |
def callback(): | |
code = request.args.get('code') | |
r = ('code [' + code + ']\n') | |
url = 'https://accounts.google.com/o/oauth2/token' | |
d = {'grant_type' : 'authorization_code', | |
'redirect_uri' : redirect_uri, | |
'code' : code, | |
'client_id' : client_id, | |
'client_secret' : client_secret | |
} | |
headers = {"Content-type": "application/x-www-form-urlencoded"} | |
data = urllib.parse.urlencode(d).encode("utf-8") | |
try: | |
resp = urllib.request.urlopen(url,data).read() | |
parsed = json.loads(resp) | |
access_token = parsed.get('access_token') | |
refresh_token = parsed.get('refresh_token') | |
token_uri = parsed.get('token_uri') | |
id_token = parsed.get('id_token') | |
credentials = google.oauth2.credentials.Credentials( | |
access_token, | |
refresh_token=refresh_token, | |
token_uri=token_uri, | |
client_id=client_id, | |
client_secret=client_secret) | |
# for google apis | |
authed_session = AuthorizedSession(credentials) | |
ar = authed_session.get('https://openidconnect.googleapis.com/v1/userinfo') | |
print(ar) | |
session['username'] = ar.json()['email'] | |
# for cloud run | |
print(id_token) | |
id_creds = google.oauth2.credentials.Credentials(token=id_token) | |
authed_session = AuthorizedSession(id_creds) | |
r = authed_session.get('https://myapp-jyosxg6puq-uc.a.run.app/') | |
#r = requests.get('https://myapp-jyosxg6puq-uc.a.run.app/', headers={"Authorization": "Bearer " + id_token}) | |
print(r.text) | |
except urllib.error.URLError as e: | |
print(e.reason) | |
return (e.reason) | |
except urllib.error.HTTPError as e: | |
print(e.reason) | |
return (e.reason) | |
return redirect("/", code=302) | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=8081, debug=True, ssl_context=('notebook.crt', 'notebook.key')) | |
Author
salrashid123
commented
Nov 2, 2021
- notebook.crt
- server.key
- ca.crt
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment