· 5 years ago · Dec 19, 2019, 03:52 PM
1# -*- coding: utf-8 -*-
2import logging
3import requests
4
5from django.conf import settings
6from django.contrib.auth import get_user_model
7
8logger = logging.getLogger(__name__)
9
10UserModel = get_user_model()
11UserManager = UserModel._default_manager
12
13
14class RemiBackend(object): #TODO: Add Permissions management
15 @staticmethod
16 def getLongToken(shortToken):
17 params = dict(grant_type='fb_exchange_token', client_id=settings.FACEBOOK_CONFIG['id'], client_secret=settings.FACEBOOK_CONFIG['secret'], fb_exchange_token=shortToken, scope=settings.FACEBOOK_CONFIG['scope'])
18 try:
19 extendedTokenData = requests.get('https://graph.facebook.com/oauth/access_token', params=params)
20 return extendedTokenData.json()['access_token']
21 except requests.exceptions.ConnectionError:
22 logger.warn('Unable to get long token for shortToken="%s". Connection error')
23 except Exception as error:
24 logger.warn('Unable to get long token for shortToken="%s". Graph API response: "%s". Error: "%s"', shortToken, extendedTokenData, error)
25 return shortToken
26
27 def get_user(self, user):
28 return UserManager.filter(id=user).first()
29
30 def authenticate(self, *args, **kwargs):
31 raise NotImplementedError
32
33
34class FacebookBackend(RemiBackend):
35 def authenticate(self, code):
36 from facebook.tools import getGraph
37 params = dict(client_id=settings.FACEBOOK_CONFIG['id'], redirect_uri=settings.FACEBOOK_CONFIG['login_uri'], client_secret=settings.FACEBOOK_CONFIG['secret'], scope=settings.FACEBOOK_CONFIG['scope'], code=code)
38 tokenData = requests.get('https://graph.facebook.com/oauth/access_token', params=params)
39 token = tokenData.json()['access_token']
40 token = self.getLongToken(token)
41 u = getGraph('me', access_token=token)
42 try:
43 user = UserManager.get(facebookId=u['id'])
44 if user.token != token:
45 user.token = token
46 user.save()
47 except UserModel.DoesNotExist:
48 user = self.createNewUser(token)
49 return user
50
51 def createNewUser(self, token):
52 a=requests.get('https://graph.facebook.com/me',params=dict(access_token=token,fields='email,first_name,last_name,name,payment_mobile_pricepoints')).json()
53 curr = a.get('payment_mobile_pricepoints',{}).get('user_currency','USD')
54 a.pop('payment_mobile_pricepoints',None)
55 a['facebookId']=a['id']
56 del a['id']
57 user = UserManager.create(currency = curr,token=token,**a)
58 user.updateFriends()
59 return user
60
61class FacebookBackend2(RemiBackend):
62 def authenticate(self, user_id, oauth_token, **kw):
63 user = UserManager.get(facebookId=user_id)
64 user.token = self.getLongToken(oauth_token)
65 user.save()
66 return user