2013-07-25 29 views
26

Tôi đang sử dụng django-allauth trên trang web của mình để đăng nhập mạng xã hội. Tôi cũng có một API REST được hỗ trợ bởi django-rest-framework, đóng vai trò phụ trợ của một ứng dụng di động. Có cách nào tôi có thể trực tiếp cắm phụ trợ xác thực của allauth vào REST api để tôi có thể xác nhận (và đăng ký) người dùng sử dụng đăng nhập Facebook trong ứng dụng di động không?Cắm django-allauth làm điểm cuối trong django-rest-framework

Để làm rõ: Phần đăng nhập Facebook được xử lý bởi SDK gốc. Tôi cần điểm cuối hoạt động như POST /user (nghĩa là, tạo người dùng mới), nhưng nhận mã thông báo oauth của Facebook làm đầu vào thay vì email/mật khẩu, v.v.

+0

bản sao có thể có của [xác thực mã thông báo oauth2 bằng django-oauth-toolkit và python-social-auth] (http://stackoverflow.com/questions/27051209/oauth2-token-authentication-using-django-oauth-toolkit- và-python-social-auth) –

Trả lời

2

Mặc dù tôi không chắc chắn cách sử dụng allauth và rest- fremework cùng nhau, allauth does not offer such an endpoint.

Góp ý: làm của riêng bạn mà không một sự thay đổi trong các cách sau:
Gọi allauth.socialaccount.providers.facebook.views.fb_complete_login (Không, socialtoken), nơi socialtoken là như tạo ra trong login_by_token. Điều đó thực hiện (một vài chức năng sâu hơn) một django.contrib.auth.login, có thể tạo ra acct.

Sau đó, để sử dụng trên các thiết bị di động, nó có thể là tốt cho các auth (không FB) token: lấy dữ liệu người dùng, và gọi rest_framework.authtoken.views.obtain_auth_token

(từ phiên?) Ghi chú:
1. Điều này không có cách nào để giải quyết xung đột email hoặc kết nối các tài khoản xã hội/địa phương.
2. Tôi chưa thử - xin vui lòng gửi mã nếu bạn có thể làm cho nó hoạt động.

9

Bạn có thể sử dụng libray này để xác thực xã hội django-rest-framework-social-oauth2. Hãy thử điều này django-allauth related code

urls.py

urlpatterns = [ 
    url(
     r'^rest/facebook-login/$', 
     csrf_exempt(RestFacebookLogin.as_view()), 
     name='rest-facebook-login' 
    ), 
] 

serializers.py

class EverybodyCanAuthentication(SessionAuthentication): 
    def authenticate(self, request): 
     return None 

views.py

class RestFacebookLogin(APIView): 
    """ 
    Login or register a user based on an authentication token coming 
    from Facebook. 
    Returns user data including session id. 
    """ 

    # this is a public api!!! 
    permission_classes = (AllowAny,) 
    authentication_classes = (EverybodyCanAuthentication,) 

    def dispatch(self, *args, **kwargs): 
     return super(RestFacebookLogin, self).dispatch(*args, **kwargs) 

    def get(self, request, *args, **kwargs): 
     try: 
      original_request = request._request 
      auth_token = request.GET.get('auth_token', '') 

      # Find the token matching the passed Auth token 
      app = SocialApp.objects.get(provider='facebook') 
      fb_auth_token = SocialToken(app=app, token=auth_token) 

      # check token against facebook 
      login = fb_complete_login(original_request, app, fb_auth_token) 
      login.token = fb_auth_token 
      login.state = SocialLogin.state_from_request(original_request) 

      # add or update the user into users table 
      complete_social_login(original_request, login) 
      # Create or fetch the session id for this user 
      token, _ = Token.objects.get_or_create(user=original_request.user) 
      # if we get here we've succeeded 
      data = { 
       'username': original_request.user.username, 
       'objectId': original_request.user.pk, 
       'firstName': original_request.user.first_name, 
       'lastName': original_request.user.last_name, 
       'sessionToken': token.key, 
       'email': original_request.user.email, 
      } 
      return Response(
       status=200, 
       data=data 
      ) 

     except: 
      return Response(status=401, data={ 
       'detail': 'Bad Access Token', 
      }) 
0

Bạn có thể sử dụng Django Rest Auth cho điều này mà phụ thuộc vào django-allauth. Nó rất dễ dàng để tích hợp.

Các vấn đề liên quan