-
Notifications
You must be signed in to change notification settings - Fork 0
/
google_auth.py
106 lines (93 loc) · 3.98 KB
/
google_auth.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import base64
import hashlib
import random
import json
import http.server
import socketserver
import requests
import credentials
import webbrowser
import google.oauth2.credentials as google_credentials
from flask import Flask
from flask import request
class google_auth(object):
def __init__(self):
self.auth_url = 'https://accounts.google.com/o/oauth2/v2/auth'
self.token_endpoint = 'https://www.googleapis.com/oauth2/v4/token'
#self.code_challenge = base64.b64encode(generate_random_string(100))
self.c = credentials.credentials()
def generate_code_challenge(self, seed_string):
seed_string = generate_random_string(100)
code_challenge = ''
md5hash = hashlib.md5()
code_challenge = base64.b64encode(md5hash.update(seed_string))
self.code_challenge = code_challenge
return code_challenge
def login(self):
# https://accounts.google.com/o/oauth2/v2/auth?
# scope=email%20profile&
# response_type=code&
# state=
# redirect_uri=http://localhost:9004&
# client_id=client_id
payload = {'client_id': self.c.get_client_id(), 'redirect_uri': 'http://127.0.0.1:5000', 'state': 'slideshow-access',
'response_type': 'code', 'scope': 'https://www.googleapis.com/auth/photoslibrary.readonly'}
r = requests.get(self.auth_url, params=payload)
webbrowser.open_new(r.url)
self.start_callback_server()
# TODO: The above call needs to be done in its own thread. It halts the completion of this code and the app freezes
print('scope is hardcoded')
#print(r.text)
#raise NotImplementedError
def start_callback_server(self):
# PORT = 8006
# Handler = http.server.SimpleHTTPRequestHandler
# Handler.parse_request()
# httpd = socketserver.TCPServer(("", PORT), Handler)
# print ("serving at port", PORT)
# httpd.serve_forever()
app = Flask(__name__)
@app.route('/')
def hello_world():
client_code = request.args.get('code', '')
# Take the code and get a token here
#auth_client = google_credentials.Credentials()
print(client_code)
#Take the client code and store it somewhere here then make a call out to the token server to get that
self.c.set_client_code(client_code)
access_info = self.generate_access_token(client_code)
print('access info')
print(access_info)
print('access info')
return 'You may continue back to your app'
@app.route('/refresh')
def refresh_token():
self.credentials = google_credentials.Credentials(token=request.args.get('access_token',''),refresh_token=request.args.get('refresh_token',''),id_token=request.args.get('id_token',''),expires_in=request.args.get('expires_in',''),client_id=self.c.get_client_id(),client_secret=self.c.get_client_secret())
app.run()
def generate_access_token(self,code):
# code=
# client_id=your_client_id&
# client_secret=your_client_secret&
# redirect_uri=https://oauth2.example.com/code&
#grant_type=authorization_code
parameters = {
'code': code,
'client_id': self.c.get_client_id(),
'client_secret': self.c.get_client_secret(),
'redirect_uri': 'http://localhost:5000/refresh',
'grant_type': 'authorization_code'
}
r = requests.post(self.token_endpoint, params=parameters)
print('Access token ')
#json_response = json.loads(r.text)
print(r.text)
return r.text
def generate_random_string(length):
seed = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.~0987654321'
generated_string = ''
counter = 0
while (counter < length):
generated_string += seed[random.randint(0, len(seed)-1)]
counter += 1
print(generated_string)
return generated_string