PageRenderTime 24ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/api/authentication/FacebookService.py

https://gitlab.com/fdemian/Shelob
Python | 103 lines | 89 code | 13 blank | 1 comment | 7 complexity | fc5536293668173f7c296d2d1207c851 MD5 | raw file
  1. from tornado.auth import FacebookGraphMixin
  2. from tornado.gen import coroutine
  3. from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound
  4. from api.model.sessionHelper import get_session
  5. from api.model.models import User
  6. class FacebookAuthService(FacebookGraphMixin):
  7. def __init__(self, key, secret):
  8. self.key = key
  9. self.secret = secret
  10. @coroutine
  11. def get(self, auth_code, redirect_url, method):
  12. print(".................")
  13. print(self.get_authenticated_user)
  14. print(".................")
  15. user_info = yield self.get_authenticated_user(
  16. redirect_uri=redirect_url,
  17. client_id=self.key,
  18. client_secret=self.secret,
  19. code=auth_code)
  20. print(user_info)
  21. if not 'email' in user_info:
  22. # expires_in = user_info["session_expires"][0]
  23. access_token = user_info["access_token"]
  24. user_fields = "id,name,email,picture,link"
  25. params = {'scope': 'email'}
  26. fb_user = yield self.facebook_request("/me", access_token=access_token, extra_params=params, fields=user_fields)
  27. if not fb_user:
  28. return None
  29. else:
  30. fb_user = user_info
  31. if method == "login":
  32. user = self.get_user_from_db(fb_user)
  33. elif method == "register":
  34. user = self.get_user_to_save(fb_user)
  35. return user
  36. @staticmethod
  37. def get_user_to_save(fb_user):
  38. if not fb_user['picture']['data']['is_silhouette']:
  39. picture = fb_user['picture']['data']['url']
  40. else:
  41. picture = ""
  42. payload = {
  43. 'id': fb_user["id"],
  44. 'avatar': picture,
  45. 'username': fb_user["name"],
  46. 'fullname': fb_user["name"],
  47. 'email': fb_user["email"],
  48. 'role': 'author'
  49. }
  50. return payload
  51. @staticmethod
  52. def get_user_from_db(fb_user):
  53. try:
  54. session_object = get_session()
  55. session = session_object()
  56. user = session.query(User).filter(User.email == fb_user['email']).one()
  57. user_link = '/users/' + str(user.id) + "/" + user.username
  58. payload = {
  59. 'id': user.id,
  60. 'avatar': user.avatar,
  61. 'username': user.username,
  62. 'role': 'author',
  63. 'link': user_link
  64. }
  65. except MultipleResultsFound:
  66. payload = None
  67. except NoResultFound:
  68. if not fb_user['picture']['data']['is_silhouette']:
  69. picture = fb_user['picture']['data']['url']
  70. else:
  71. picture = ""
  72. payload = {
  73. 'id': fb_user["id"],
  74. 'avatar': picture,
  75. 'username': fb_user["name"],
  76. 'role': 'guest',
  77. 'link': fb_user["link"]
  78. }
  79. return payload