def callback(): redirect_uri = url_for('.callback', _external=True) result = process_authenticate_callback(redirect_uri) if 'error' in result: flash(result['error'], category='danger') return redirect(url_for('views.index')) # find or create the account user_id = result['user_id'] account = Account.lookup_by_user_id(SERVICE_NAME, user_id) if not account: account = Account(service=SERVICE_NAME, user_id=user_id) db.session.add(account) account.username = result['username'] account.user_info = result['user_info'] account.token = result['token'] account.refresh_token = result['refresh'] account.expiry = result['expiry'] r = requests.get(API_BLOGS_URL, headers={ 'Authorization': 'Bearer ' + account.token, }) if util.check_request_failed(r): return redirect(url_for('views.index')) payload = r.json() blogs = payload.get('items', []) # find or create the sites sites = [] for blog in blogs: sites.append(Blogger( url=blog.get('url'), domain=util.domain_for_url(blog.get('url')), site_id=blog.get('id'), site_info=blog)) account.update_sites(sites) db.session.commit() flash('Authorized {}: {}'.format(account.username, ', '.join( s.domain for s in account.sites))) util.set_authed(account.sites) return redirect(url_for('views.setup_account', service=SERVICE_NAME, user_id=account.user_id))
def process_authenticate_callback(redirect_uri): code = request.args.get('code') error = request.args.get('error') if error: return {'error': 'Blogger authorization canceled or ' 'failed with error: {}' .format(error)} if not validate_csrf(request.args.get('state')): return {'error': 'csrf token mismatch in blogger callback.'} r = requests.post(API_TOKEN_URL, data={ 'code': code, 'client_id': current_app.config['GOOGLE_CLIENT_ID'], 'client_secret': current_app.config['GOOGLE_CLIENT_SECRET'], 'redirect_uri': redirect_uri, 'grant_type': 'authorization_code', }) if util.check_request_failed(r): return {'error': 'failed to validate access token'} current_app.logger.info('Got Blogger access token response: %s', r.text) payload = r.json() access_token = payload.get('access_token') expires_in = payload.get('expires_in') refresh_token = payload.get('refresh_token') if expires_in: expiry = datetime.datetime.utcnow() + datetime.timedelta( seconds=int(expires_in)) else: expiry = None current_app.logger.info( 'Got Blogger access token: %s. expiry: %s. refresh token: %s', access_token, expiry, refresh_token) r = requests.get(API_SELF_URL, headers={ 'Authorization': 'Bearer ' + access_token, }) if util.check_request_failed(r): return {'error': 'failed to fetch {}'.format(API_SELF_URL)} payload = r.json() username = user_id = payload.get('id') account = Account.lookup_by_user_id(SERVICE_NAME, user_id) if account: # update the saved tokens account.token = access_token account.expiry = expiry if refresh_token: account.refresh_token = refresh_token db.session.commit() return { 'user_id': user_id, 'username': username, 'user_info': payload, 'token': access_token, 'refresh': refresh_token, 'expiry': expiry, }
def process_callback(redirect_uri): code = request.args.get('code') error = request.args.get('error') if error: return {'error': 'Blogger authorization canceled or ' 'failed with error: {}' .format(error)} if not validate_csrf(request.args.get('state')): return {'error': 'csrf token mismatch in blogger callback.'} r = requests.post(API_TOKEN_URL, data={ 'code': code, 'client_id': current_app.config['GOOGLE_CLIENT_ID'], 'client_secret': current_app.config['GOOGLE_CLIENT_SECRET'], 'redirect_uri': redirect_uri, 'grant_type': 'authorization_code', }) if util.check_request_failed(r): return {'error': 'failed to validate access token'} current_app.logger.info('Got Blogger access token response: %s', r.text) payload = r.json() access_token = payload.get('access_token') expires_in = payload.get('expires_in') refresh_token = payload.get('refresh_token') if expires_in: expiry = datetime.datetime.utcnow() + datetime.timedelta( seconds=int(expires_in)) else: expiry = None current_app.logger.info( 'Got Blogger access token: %s. expiry: %s. refresh token: %s', access_token, expiry, refresh_token) r = requests.get(API_SELF_URL, headers={ 'Authorization': 'Bearer ' + access_token, }) if util.check_request_failed(r): return {'error': 'failed to fetch {}'.format(API_SELF_URL)} payload = r.json() username = user_id = payload.get('id') # find or create the account account = Account.lookup_by_user_id(SERVICE_NAME, user_id) if not account: account = Account(service=SERVICE_NAME, user_id=user_id) db.session.add(account) account.username = username account.user_info = payload account.token = access_token account.refresh_token = refresh_token account.expiry = expiry r = requests.get(API_BLOGS_URL, headers={ 'Authorization': 'Bearer ' + account.token, }) if util.check_request_failed(r): return redirect(url_for('views.index')) payload = r.json() blogs = payload.get('items', []) # find or create the sites sites = [] for blog in blogs: sites.append(Blogger( url=blog.get('url'), domain=util.domain_for_url(blog.get('url')), site_id=blog.get('id'), site_info=blog)) account.update_sites(sites) db.session.commit() util.set_authed(account.sites) return {'account': account}