Skip to content

Instantly share code, notes, and snippets.

@jackyq2015
Forked from Scarygami/necessary_client.html
Created March 11, 2018 23:55
Show Gist options
  • Save jackyq2015/c88aee46b50457a5add92714b9b3121e to your computer and use it in GitHub Desktop.
Save jackyq2015/c88aee46b50457a5add92714b9b3121e to your computer and use it in GitHub Desktop.
Google Sign-In 2.0 Server-side samples
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Google Sign-in 2.0 - Necessary Client</title>
<script src="https://apis.google.com/js/client:platform.js?onload=clientLoaded" async defer></script>
</head>
<body>
<button id="enable_offline_access">Enable Offline Access</button>
<script type="text/javascript">
(function (global) {
global.clientLoaded = function () {
var authorizeProcessRunning = false;
global.gapi.load('auth2', function () {
var auth2 = gapi.auth2.init({
client_id: 'YOUR-CLIENT-ID.apps.googleusercontent.com',
scope: 'profile https://www.googleapis.com/auth/glass.timeline'
});
auth2.isSignedIn.listen(function (signedIn) {
/**
* This will be called after the auth library is initialized
* if the user has previously authenticated, or at the same time
* that grantOfflineAccess returns a code.
* We only want to verify the offline access for existing users
*/
if (signedIn && !authorizeProcessRunning) {
sendPostRequest('/verify', {id_token: id_token}).then(function (response) {
if (response.access_granted) {
global.document.getElementById('enable_offline_access').style.display = 'none';
}
});
}
});
auth2.then(function () {
global.document.getElementById("enable_offline_access").onclick = function () {
// request one-time code
authorizeProcessRunning = true;
gapi.auth2.getAuthInstance().grantOfflineAccess({
redirect_uri: 'postmessage'
}).then(function (auth_response) {
// send one-time code to the server and wait for response
sendPostRequest('/authorize', {code: auth_response.code}).then(function (response) {
if (response.access_granted) {
global.document.getElementById('enable_offline_access').style.display = 'none';
}
authorizeProcessRunning = false;
});
});
};
});
});
};
}(this));
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Google Sign-in 2.0 - Optional Client</title>
<script src="https://apis.google.com/js/client:platform.js" async defer></script>
<meta name="google-signin-client_id" content="YOUR-CLIENT-ID.apps.googleusercontent.com">
</head>
<body>
<div class="g-signin2" data-onsuccess="onSignIn"></div>
<button id="enable_offline_access" style="display: none">Enable Offline Access</button>
<script type="text/javascript">
(function (global) {
global.onSignIn = function (user) {
var id_token = user.getAuthResponse().id_token;
// Some function to send the id_token to your server
sendPostRequest('/verify', {id_token: id_token}).then(function (response) {
if (!response.access_granted) {
global.document.getElementById('enable_offline_access').style.display = 'block';
}
});
};
global.document.getElementById("enable_offline_access").onclick = function () {
// request one-time code
gapi.auth2.getAuthInstance().grantOfflineAccess({
redirect_uri: 'postmessage',
scope: 'https://www.googleapis.com/auth/glass.timeline'
}).then(function (auth_response) {
// send one-time code to the server and wait for response
sendPostRequest('/authorize', {code: auth_response.code}).then(function (response) {
if (response.access_granted) {
global.document.getElementById('enable_offline_access').style.display = 'none';
}
});
});
};
}(this));
</script>
</body>
</html>
{
"iss": "accounts.google.com",
"sub": "112336147904981294875",
"azp": "YOUR-CLIENT-ID.apps.googleusercontent.com",
"email": "email@gmail.com",
"at_hash": "ABCHASJDKJAHJ1231w",
"email_verified": true,
"aud": "YOUR-CLIENT-ID.apps.googleusercontent.com",
"iat": 1429619207,
"exp": 1429622807,
"name": "Gerwin Sturm",
"picture": "https://lh3.googleusercontent.com/-khaIYLifQik/AAAAAAAAAAI/AAAAAAACclE/rspep_SceFo/s96-c/photo.jpg",
"given_name": "Gerwin",
"family_name": "Sturm",
"locale": "en"
}
#!/usr/bin/python
import json
import random
import string
from flask import Flask
from flask import make_response
from flask import request
import httplib2
import oauth2client.client
from oauth2client.crypt import AppIdentityError
APPLICATION_NAME = 'Google Sign-in 2.0 - Server'
app = Flask(__name__)
app.secret_key = ''.join(random.choice(string.ascii_uppercase + string.digits)
for x in xrange(32))
CLIENT_ID = json.loads(
open('client_secrets.json', 'r').read())['web']['client_id']
@app.route('/verify', methods=['POST'])
def verify():
id_token = request.get_json().get('id_token', None)
try:
# Verify the ID token using the client library.
jwt = verify_id_token(id_token, CLIENT_ID)
user_id = jwt['sub']
except AppIdentityError:
user_id = None
if user_id is None:
response = make_response('invalid token', 401)
return response
# try to retrieve previously stored credentials via some function
credentials = get_credentials(user_id)
response_data = {}
if credentials is None:
response_data['access_granted'] = False
else:
response_data['access_granted'] = True
response = make_response(json.dumps(response_data), 200)
response.headers['Content-Type'] = 'application/json'
return response
@app.route('/authorize', methods=['POST'])
def authorize():
code = request.get_json().get('code', None)
try:
# Upgrade the authorization code into a credentials object
oauth_flow = flow_from_clientsecrets('client_secrets.json', scope='')
oauth_flow.redirect_uri = 'postmessage'
credentials = oauth_flow.step2_exchange(code)
except FlowExchangeError:
response = make_response(json.dumps({'access_granted': False}), 401)
response.headers['Content-Type'] = 'application/json'
return response
user_id = credentials.id_token['sub']
# store the credentials for this user via some function for later use
store_credentials(user_id, credentials)
response = make_response(json.dumps({'access_granted': True}), 200)
response.headers['Content-Type'] = 'application/json'
return response
if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0', port=4567)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Google Sign-in 2.0 - Basic Client</title>
<script src="https://apis.google.com/js/client:platform.js" async defer></script>
<meta name="google-signin-client_id" content="YOUR-CLIENT-ID.apps.googleusercontent.com">
</head>
<body>
<div class="g-signin2" data-onsuccess="onSignIn"></div>
<script type="text/javascript">
(function (global) {
global.onSignIn = function (user) {
var id_token = user.getAuthResponse().id_token;
// some function to send the id_token to your server
sendPostRequest('/verify', {id_token: id_token})
};
}(this));
</script>
</body>
</html>
#!/usr/bin/python
import json
import random
import string
from flask import Flask
from flask import make_response
from flask import request
import httplib2
import oauth2client.client
from oauth2client.crypt import AppIdentityError
APPLICATION_NAME = 'Google Sign-in 2.0 - Basic Server'
app = Flask(__name__)
app.secret_key = ''.join(random.choice(string.ascii_uppercase + string.digits)
for x in xrange(32))
CLIENT_ID = json.loads(
open('client_secrets.json', 'r').read())['web']['client_id']
@app.route('/verify', methods=['POST'])
def verify():
id_token = request.get_json().get('id_token', None)
try:
# Verify the ID token using the client library.
jwt = verify_id_token(id_token, CLIENT_ID)
user_id = jwt['sub']
except AppIdentityError:
user_id = None
if user_id is None:
response = make_response('invalid token', 401)
return response
# Here you can get data relevant to user_id and return it
response = make_response('successfully verified', 200)
return reponse
if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0', port=4567)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment