def get_token(self, code): """ Get live access token :type code: str :param code: :rtype: str :return: access token and uid """ # live need post a form to get token headers = {'Content-type': 'application/x-www-form-urlencoded'} data = { 'client_id': get_config('login.live.client_id'), 'client_secret': get_config('login.live.client_secret'), 'redirect_uri': get_config('login.live.redirect_uri'), 'grant_type': 'authorization_code', 'code': code } # Following is use urllib to post request url = get_config('login.live.access_token_url') r = requests.post(url, data=data, headers=headers) resp = r.json() if resp.get("error") is not None: raise Exception(resp) return resp["access_token"]
def get_token(self, code): """ Get live access token :type code: str :param code: :rtype: str :return: access token and uid """ # live need post a form to get token headers = {"Content-type": "application/x-www-form-urlencoded"} data = { "client_id": get_config("login.live.client_id"), "client_secret": get_config("login.live.client_secret"), "redirect_uri": get_config("login.live.redirect_uri"), "grant_type": "authorization_code", "code": code, } # Following is use urllib to post request url = get_config("login.live.access_token_url") r = requests.post(url, data=data, headers=headers) resp = r.json() if resp.get("error") is not None: raise Exception(resp) return resp["access_token"]
def __oauth_api_key(): return { LOGIN_PROVIDER.WEIBO: get_config("login.weibo.client_id"), LOGIN_PROVIDER.QQ: get_config("login.qq.client_id"), LOGIN_PROVIDER.LIVE: get_config("login.live.client_id"), LOGIN_PROVIDER.GITCAFE: get_config("login.gitcafe.client_id"), LOGIN_PROVIDER.GITHUB: get_config("login.github.client_id"), }
def __oauth_api_key(): return { LOGIN_PROVIDER.WEIBO: get_config('login.weibo.client_id'), LOGIN_PROVIDER.QQ: get_config('login.qq.client_id'), LOGIN_PROVIDER.LIVE: get_config('login.live.client_id'), LOGIN_PROVIDER.WECHAT: get_config("login.wechat.client_id"), LOGIN_PROVIDER.GITHUB: get_config('login.github.client_id') }
def login(self, args): code = args.get('code') if not code: return None log.info('login from alauda, code = ' + code) # basic auth header, content_type and post data client_id = get_config("login.alauda.client_id") client_secret = get_config("login.alauda.client_secret") basic_auth = HTTPBasicAuth(client_id, client_secret) headers = {'Content-type': 'application/x-www-form-urlencoded'} data = { 'grant_type': 'authorization_code', 'code': code, 'redirect_uri': get_config('login.alauda.redirect_uri'), 'client_id': client_id } # Post request url = get_config('login.alauda.access_token_url') r = requests.post(url, data=data, headers=headers, auth=basic_auth) resp = r.json() # {u'username': u'junbowang', u'realname': u'junbowang', u'success': True, # u'access_token': u'3MyZLF8RVo5X8lDLZQSj5s4OpIGQGn', u'token_type': u'Bearer', # u'logo_file': u'/static/images/user/default-logo.png', u'email': u'*****@*****.**'} if not resp.get("success"): log.debug("get access token failed from alauda: %r" % resp) return None # username will used as openid too since its unique. And also it's the 'namespace' for user's alauda resource username = resp["username"] email = resp["email"] email_list = [ { 'name': username, 'email': email, 'verified': 1, 'primary': 1 } ] user_with_token = user_manager.oauth_db_login(username, provider=LOGIN_PROVIDER.ALAUDA, name=username, nickname=resp.get("realname", username), access_token=resp["access_token"], email_list=email_list, avatar_url=resp.get("logo_file")) # for oxford only self.oxford(user_with_token["user"], resp.get("oxford_api")) return user_with_token
def login(self, args): code = args.get('code') if not code: return None log.info('login from alauda, code = ' + code) # basic auth header, content_type and post data client_id = get_config("login.alauda.client_id") client_secret = get_config("login.alauda.client_secret") basic_auth = HTTPBasicAuth(client_id, client_secret) headers = {'Content-type': 'application/x-www-form-urlencoded'} data = { 'grant_type': 'authorization_code', 'code': code, 'redirect_uri': get_config('login.alauda.redirect_uri'), 'client_id': client_id } # Post request url = get_config('login.alauda.access_token_url') r = requests.post(url, data=data, headers=headers, auth=basic_auth) resp = r.json() # {u'username': u'junbowang', u'realname': u'junbowang', u'success': True, # u'access_token': u'3MyZLF8RVo5X8lDLZQSj5s4OpIGQGn', u'token_type': u'Bearer', # u'logo_file': u'/static/images/user/default-logo.png', u'email': u'*****@*****.**'} if not resp.get("success"): log.debug("get access token failed from alauda: %r" % resp) return None # username will used as openid too since its unique. And also it's the 'namespace' for user's alauda resource username = resp["username"] email = resp["email"] email_list = [ { 'name': username, 'email': email, 'verified': 1, 'primary': 1 } ] required_info = { "openid": username, "provider": LOGIN_PROVIDER.ALAUDA, "name": username, "nickname": resp.get("realname", username), "access_token": resp["access_token"], "email_list": email_list, "avatar_url": resp.get("logo_file"), "oxford_api": resp.get("oxford_api") } return required_info
def login(self, args): code = args.get("code") if not code: return None log.info("login from alauda, code = " + code) # basic auth header, content_type and post data client_id = get_config("login.alauda.client_id") client_secret = get_config("login.alauda.client_secret") basic_auth = HTTPBasicAuth(client_id, client_secret) headers = {"Content-type": "application/x-www-form-urlencoded"} data = { "grant_type": "authorization_code", "code": code, "redirect_uri": get_config("login.alauda.redirect_uri"), "client_id": client_id, } # Post request url = get_config("login.alauda.access_token_url") r = requests.post(url, data=data, headers=headers, auth=basic_auth) resp = r.json() # {u'username': u'junbowang', u'realname': u'junbowang', u'success': True, # u'access_token': u'3MyZLF8RVo5X8lDLZQSj5s4OpIGQGn', u'token_type': u'Bearer', # u'logo_file': u'/static/images/user/default-logo.png', u'email': u'*****@*****.**'} if not resp.get("success"): log.debug("get access token failed from alauda: %r" % resp) return None # username will used as openid too since its unique. And also it's the 'namespace' for user's alauda resource username = resp["username"] email = resp["email"] email_list = [{"name": username, "email": email, "verified": 1, "primary": 1}] required_info = { "openid": username, "provider": LOGIN_PROVIDER.ALAUDA, "name": username, "nickname": resp.get("realname", username), "access_token": resp["access_token"], "email_list": email_list, "avatar_url": resp.get("logo_file"), "oxford_api": resp.get("oxford_api"), } return required_info
def get_user_info(self, token, uid): """Get weibo user info :type token: str :param token: :type uid: str :param uid: :rtype: dict :return: {"id":2330622122,"idstr":"2330622122","class":1,"screen_name":"test name","name":"test name", "province":"31","city":"10","location":"shanghai yangpu","description":"","url":"", "profile_image_url":"http://tp3.sinaimg.cn/2330622122/50/5629035320/1", "profile_url":"u/2330622122","domain":"","weihao":"","gender":"m","followers_count":34, "friends_count":42,"pagefriends_count":0,"statuses_count":0,"favourites_count":1, "created_at":"Mon Aug 22 17:58:15 +0800 2011","following":false,"allow_all_act_msg":false, "geo_enabled":true,"verified":false,"verified_type":-1,"remark":"","ptype":0,"allow_all_comment":true, "avatar_large":"http://tp3.sinaimg.cn/2330622122/180/5629035320/1","avatar_hd":"http://tp3.sinaimg.cn/2330622122/180/5629035320/1", "verified_reason":"","verified_trade":"","verified_reason_url":"","verified_source":"","verified_source_url":"", "follow_me":false,"online_status":0,"bi_followers_count":8,"lang":"zh-cn","star":0,"mbtype":0,"mbrank":0, "block_word":0,"block_app":0,"credit_score":80,"urank":6} """ # https://api.weibo.com/2/users/show.json?access_token=2.005RDjXC0rYD8d39ca83156aLZWgZE&uid=1404376560 user_info_resp = get_remote( get_config('login.weibo.user_info_url') + token + "&uid=" + uid) user_info = json.loads(user_info_resp) if user_info.get("error") is not None: raise Exception(user_info) return user_info
def get_user_info(self, token): """Get qq user info :type token: str :param token: :rtype: dict :return: "url":"https://api.github.com/users/juniwang","html_url":"https://github.com/juniwang", "followers_url":"https://api.github.com/users/juniwang/followers", log.debug("get admin user info from " + provider + " : " + user_info_resp + '\n' ) "following_url":"https://api.github.com/users/juniwang/following{/other_user}", "starred_url":"https://api.github.com/users/juniwang/starred{/owner}{/repo}", "gists_url":"https://api.github.com/users/juniwang/gists{/gist_id}", "events_url":"https://api.github.com/users/juniwang/events{/privacy}", {"login":"******","id":8814383,"avatar_url":"https://avatars.githubusercontent.com/u/8814383?v=3","gravatar_id":"", "subscriptions_url":"https://api.github.com/users/juniwang/subscriptions", "received_events_url":"https://api.github.com/users/juniwang/received_events","type":"User","site_admin":false, "name":"Junbo Wang","company":"","blog":"","location":"Shanghai China", "organizations_url":"https://api.github.com/users/juniwang/orgs","repos_url":"https://api.github.com/users/juniwang/repos", "email":"*****@*****.**","hireable":false,"bio":null,"public_repos":12,"public_gists":0,"followers":0, "following":1,"created_at":"2014-09-18T01:30:30Z","updated_at":"2014-11-25T09:00:37Z","private_gists":0, "plan":{"name":"free","space":307200,"collaborators":0,"private_repos":0}} "total_private_repos":0,"owned_private_repos":0,"disk_usage":14179,"collaborators":0, """ user_info_resp = get_remote(get_config('login.github.user_info_url') + token) user_info = json.loads(user_info_resp) if user_info.get("message") is not None: raise Exception(user_info) return user_info
def get_user_info(self, token, uid): """Get weibo user info :type token: str :param token: :type uid: str :param uid: :rtype: dict :return: {"id":2330622122,"idstr":"2330622122","class":1,"screen_name":"test name","name":"test name", "province":"31","city":"10","location":"shanghai yangpu","description":"","url":"", "profile_image_url":"http://tp3.sinaimg.cn/2330622122/50/5629035320/1", "profile_url":"u/2330622122","domain":"","weihao":"","gender":"m","followers_count":34, "friends_count":42,"pagefriends_count":0,"statuses_count":0,"favourites_count":1, "created_at":"Mon Aug 22 17:58:15 +0800 2011","following":false,"allow_all_act_msg":false, "geo_enabled":true,"verified":false,"verified_type":-1,"remark":"","ptype":0,"allow_all_comment":true, "avatar_large":"http://tp3.sinaimg.cn/2330622122/180/5629035320/1","avatar_hd":"http://tp3.sinaimg.cn/2330622122/180/5629035320/1", "verified_reason":"","verified_trade":"","verified_reason_url":"","verified_source":"","verified_source_url":"", "follow_me":false,"online_status":0,"bi_followers_count":8,"lang":"zh-cn","star":0,"mbtype":0,"mbrank":0, "block_word":0,"block_app":0,"credit_score":80,"urank":6} """ # https://api.weibo.com/2/users/show.json?access_token=2.005RDjXC0rYD8d39ca83156aLZWgZE&uid=1404376560 user_info_resp = get_remote(get_config('login.weibo.user_info_url') + token + "&uid=" + uid) user_info = json.loads(user_info_resp) if user_info.get("error") is not None: raise Exception(user_info) return user_info
def get_user_info(self, token): """Get qq user info :type token: str :param token: :rtype: dict :return: "url":"https://api.github.com/users/juniwang","html_url":"https://github.com/juniwang", "followers_url":"https://api.github.com/users/juniwang/followers", log.debug("get admin user info from " + provider + " : " + user_info_resp + '\n' ) "following_url":"https://api.github.com/users/juniwang/following{/other_user}", "starred_url":"https://api.github.com/users/juniwang/starred{/owner}{/repo}", "gists_url":"https://api.github.com/users/juniwang/gists{/gist_id}", "events_url":"https://api.github.com/users/juniwang/events{/privacy}", {"login":"******","id":8814383,"avatar_url":"https://avatars.githubusercontent.com/u/8814383?v=3","gravatar_id":"", "subscriptions_url":"https://api.github.com/users/juniwang/subscriptions", "received_events_url":"https://api.github.com/users/juniwang/received_events","type":"User","site_admin":false, "name":"Junbo Wang","company":"","blog":"","location":"Shanghai China", "organizations_url":"https://api.github.com/users/juniwang/orgs","repos_url":"https://api.github.com/users/juniwang/repos", "email":"*****@*****.**","hireable":false,"bio":null,"public_repos":12,"public_gists":0,"followers":0, "following":1,"created_at":"2014-09-18T01:30:30Z","updated_at":"2014-11-25T09:00:37Z","private_gists":0, "plan":{"name":"free","space":307200,"collaborators":0,"private_repos":0}} "total_private_repos":0,"owned_private_repos":0,"disk_usage":14179,"collaborators":0, """ user_info_resp = get_remote( get_config('login.github.user_info_url') + token) user_info = json.loads(user_info_resp) if user_info.get("message") is not None: raise Exception(user_info) return user_info
def __get_api(url, headers=None, **kwargs): default_headers = {"content-type": "application/json"} if headers is not None and isinstance(headers, dict): default_headers.update(headers) try: req = requests.get(get_config("endpoint.hackathon_api") + url, headers=default_headers, **kwargs) resp = req.content return json.loads(resp) except Exception as e: abort(500, 'API Service is not yet open')
def __get_api(url, headers=None, **kwargs): default_headers = {"content-type": "application/json"} if headers is not None and isinstance(headers, dict): default_headers.update(headers) try: req = requests.get(get_config("hackathon-api.endpoint") + url, headers=default_headers, **kwargs) resp = json.loads(req.content) return resp except Exception as e: abort(500, "API Service is not yet open")
def __oauth_login(self, provider): code = request.args.get('code') oauth_data = { "code": code, "redirect_uri": get_config("endpoint.hackathon_web") + "/" + provider, "provider": provider } return self.__remote_login(oauth_data)
def get_emails(self, token): """Get user primary email :type token: str :param token: :rtype: dict :return: emails """ email_info_resp = get_remote(get_config('login.github.emails_info_url') + token) email_list = json.loads(email_info_resp) return email_list
def get_token(self, code): """ Get gitcafe access token :type code: str :param code: :rtype: str :return: access token """ token_resp = get_remote(get_config("login.gitcafe.access_token_url") + code) query = qs_dict(token_resp) if query.get("error") is not None: raise Exception(query) return query["access_token"]
def get_token(self, code): """ Get weibo access token :type code: str :param code: :rtype: dict :return: access token and uid """ token_resp = post_to_remote(get_config('login.weibo.access_token_url') + code, {}) if token_resp.get("error") is not None: raise Exception(token_resp) return token_resp
def get_token(self, code): """ Get gitcafe access token :type code: str :param code: :rtype: str :return: access token """ token_resp = get_remote( get_config("login.gitcafe.access_token_url") + code) query = qs_dict(token_resp) if query.get("error") is not None: raise Exception(query) return query["access_token"]
def get_user_info(self, access_token, openid): """get user info from wx-api this is the final step to login with wechat :type access_token: str :param access_token: the access token get from wx :type openid: str :param openid: the openid get from wx to specified user :rtype: dict :return: then user info accessed from wechat """ url = get_config("login.wechat.user_info_url") % (access_token, openid) return self._access_wxapi_or_raise(url)
def get_access_token(self, code): """get access token from wx-api this is the second step to login with wechat after the client get the code :type code: str :param code: code get from wx :rtype: tuple :return: then access token and user open id in a tuple """ url = get_config("login.wechat.access_token_url") % code r = self._access_wxapi_or_raise(url) return (r["access_token"], r["openid"])
def get_email(self, token, uid): """Get weibo user info :type token: str :param token: :rtype: str :return : email """ email_info_resp = get_remote(get_config('login.weibo.email_info_url') + token) email_info_resp_json = json.loads(email_info_resp) if email_info_resp_json.get("error") is not None: raise Exception(email_info_resp_json) return email_info_resp_json['email']
def get_info(self, token): """ Get qq open id :type token: str :param token: :rtype: dict :return: info """ openid_resp = get_remote(get_config("login.qq.openid_url") + token) log.debug("get access_token from qq:" + token) info = json.loads(openid_resp[10:-4]) if info.get("error") is not None: raise Exception(info) return info
def get_user_info(self, authorization): """Get qq user info :type authorization: str :param authorization: :rtype: dict :return: user info """ opener = urllib2.build_opener(urllib2.HTTPHandler) request = urllib2.Request(get_config("login.gitcafe.user_info_url")) request.add_header("Authorization", authorization) user_info = json.loads(opener.open(request).read()) if user_info.get("error") is not None: raise Exception(user_info) return user_info
def get_token(self, code): """ Get qq access token :type code: str :param code: :rtype: str :return: access token """ state = "openhackathon" token_resp = get_remote(get_config("login.qq.access_token_url") + code + "&state=" + state) if token_resp.find('callback') == 0: error = json.loads(token_resp[10:-4]) raise Exception(error) query = qs_dict(token_resp) return query["access_token"]
def get_user_info(self, token): """Get live user info :type token: str :param token: :rtype: dict :return: {'first_name': 'Ice', 'last_name': 'Shi', 'name': 'Ice Shi', 'locale': 'en_US', 'gender': None, 'emails': {'personal': None, 'account': '*****@*****.**', 'business': None, 'preferred': '*****@*****.**'}, 'link': 'https://profile.live.com/', 'updated_time': '2015-05-13T02:28:32+0000', 'id': '655c03b1b314b5ee'} """ user_info_resp = get_remote(get_config('login.live.user_info_url') + token) user_info = json.loads(user_info_resp) if user_info.get("error") is not None: raise Exception(user_info) return user_info
def get_user_info(self, token, openid, client_id): """Get qq user info :type token: str :param token: :type openid: str :param openid: :type client_id: str :param client_id: :rtype: dict :return: user info """ url = get_config("login.qq.user_info_url") % (token, client_id, openid) user_info_resp = get_remote(url) user_info = convert(json.loads(user_info_resp)) if user_info.get("ret") != 0: raise Exception(user_info) return user_info
def __oauth_meta_content(): return { LOGIN_PROVIDER.WEIBO: get_config('login.weibo.meta_content'), LOGIN_PROVIDER.QQ: get_config('login.qq.meta_content') }
class LoginManagerHelper(): '''Helper class for flask-login.LoginManager''' headers = {"Content-Type": "application/json"} login_url = get_config("hackathon-api.endpoint") + "/api/user/login" def load_user(self, id): try: req = requests.get(self.login_url, {"id": id}) login_user = User(json.loads(req.content)) return login_user except Exception as e: log.error(e) return None def logout(self, token): try: requests.delete(self.login_url, headers={"token": token}) except Exception as e: log.error(e) session.pop("token", "") logout_user() def login(self, provider): if provider == LOGIN_PROVIDER.MYSQL: return self.__mysql_login() else: return self.__oauth_login(provider) def __oauth_login(self, provider): code = request.args.get('code') oauth_resp = login_providers[provider].login({"code": code}) return self.__remote_login(oauth_resp) def __mysql_login(self): data = { "provider": LOGIN_PROVIDER.MYSQL, "openid": request.form['username'], "username": request.form['username'], "password": encode(request.form['password']) } return self.__remote_login(data) def __remote_login(self, data): try: req = requests.post(self.login_url, json=data, headers=self.headers) resp = req.json() if "error" in resp: log.debug("login failed: %r" % resp) return None else: login_user = User(resp["user"]) token = resp["token"] return {"user": login_user, "token": token["token"]} except Exception as e: log.error(e) return None
def __oauth_meta_content(): return { LOGIN_PROVIDER.WEIBO: get_config("login.weibo.meta_content"), LOGIN_PROVIDER.QQ: get_config("login.qq.meta_content"), }
def js_config(): resp = Response(response="var CONFIG=%s" % json.dumps(get_config("javascript")), status=200, mimetype="application/javascript") return resp
def js_config(): resp = Response( response="var CONFIG=%s" % json.dumps(get_config("javascript")), status=200, mimetype="application/javascript" ) return resp
class LoginManagerHelper(): '''Helper class for flask-login.LoginManager''' headers = {"Content-Type": "application/json"} login_url = get_config("endpoint.hackathon_api") + "/api/user/login" def load_user(self, id): try: req = requests.get(self.login_url, {"id": id}) login_user = User(json.loads(req.content)) return login_user except Exception as e: log.error(e) return None def logout(self, token): try: requests.delete(self.login_url, headers={"token": token}) except Exception as e: log.error(e) session.pop("token", "") logout_user() def login(self, provider): if provider == LOGIN_PROVIDER.DB: return self.__mysql_login() else: return self.__oauth_login(provider) def __oauth_login(self, provider): code = request.args.get('code') oauth_data = { "code": code, "redirect_uri": get_config("endpoint.hackathon_web") + "/" + provider, "provider": provider } return self.__remote_login(oauth_data) def __mysql_login(self): data = { "provider": LOGIN_PROVIDER.DB, "username": request.form['username'], "password": encode(request.form['password']) } return self.__remote_login(data) def __remote_login(self, data): try: req = requests.post(self.login_url, json=data, headers=self.headers) resp = req.json() if resp: # if login isn't successful, it will return None login_user = User(resp["user"]) token = resp["token"] log.debug("Login successfully %s" % login_user.get_user_id()) return {"user": login_user, "token": token["token"]} else: log.debug("login failed: %r" % resp) return None except Exception as e: log.error(e) return None