2014-10-30 21 views
6

Tôi có API REST và tôi cần xác thực người dùng thông qua API đăng nhập Facebook. Mã truy cập sẽ được lấy trong ứng dụng di động (tôi đoán) và sau đó được gửi đến máy chủ. Vì vậy, tôi đã tìm thấy một số mã trong hướng dẫn cũ và tôi không thể làm cho nó hoạt động. Dưới đây là các mã:Cách xác thực bằng Mã truy cập bằng mã python-social-auth

from social.apps.django_app.utils import strategy 
from django.contrib.auth import login 
from django.views.decorators.csrf import csrf_exempt 
from rest_framework.decorators import api_view, permission_classes 
from rest_framework import permissions, status 
from django.http import HttpResponse as Response 


@strategy() 
def auth_by_token(request, backend): 
    user=request.user 
    user = backend.do_auth(
     access_token=request.DATA.get('access_token'), 
     user=user.is_authenticated() and user or None 
     ) 
    if user and user.is_active: 
     return user 
    else: 
     return None 



@csrf_exempt 
@api_view(['POST']) 
@permission_classes((permissions.AllowAny,)) 
def social_register(request): 
    auth_token = request.DATA.get('access_token', None) 
    backend = request.DATA.get('backend', None) 
    if auth_token and backend: 
     try: 
      user = auth_by_token(request, backend) 
     except Exception, err: 
      return Response(str(err), status=400) 
     if user: 
      login(request, user) 
      return Response("User logged in", status=status.HTTP_200_OK) 
     else: 
      return Response("Bad Credentials", status=403) 
    else: 
     return Response("Bad request", status=400) 

Khi tôi cố gắng để gửi yêu cầu với thông số POST, tôi nhận được lỗi này:

'unicode' object has no attribute 'do_auth' 

tôi tìm thấy một ví dụ trong official documentation, nó sử dụng @psa('social:complete') trang trí:

from django.contrib.auth import login 

from social.apps.django_app.utils import psa 

# Define an URL entry to point to this view, call it passing the 
# access_token parameter like ?access_token=<token>. The URL entry must 
# contain the backend, like this: 
# 
# url(r'^register-by-token/(?P<backend>[^/]+)/$', 
#  'register_by_access_token') 

@psa('social:complete') 
def register_by_access_token(request, backend): 
    # This view expects an access_token GET parameter, if it's needed, 
    # request.backend and request.strategy will be loaded with the current 
    # backend and strategy. 
    token = request.GET.get('access_token') 
    user = backend.do_auth(request.GET.get('access_token')) 
    if user: 
     login(request, user) 
     return 'OK' 
    else: 
     return 'ERROR' 

Nhưng nếu tôi cần chuyển tên phụ trợ trong phần nội dung yêu cầu thì sao?

+1

Nó phải là '' request.backend.do_auth (request.GET.get ('access_token')) '', tôi đã cập nhật các tài liệu với đoạn mã đúng. – omab

+0

Bạn có thể đăng nó làm câu trả lời không? –

Trả lời

3

Nó phải là request.backend.do_auth(request.GET.get('access_token')).

Tôi đã cập nhật tài liệu với đoạn mã bên phải http://psa.matiasaguirre.net/docs/use_cases.html#signup-by-oauth-access-token.

+0

Tôi cần thêm yêu cầu = yêu cầu vào đối số do_auth - nếu không có đường dẫn social_auth.backends.pipeline.misc.save_status_to_session này đã khiến luồng ủy quyền không trả lại người dùng. @omab nếu bạn nghĩ là hợp lệ, vui lòng cập nhật tài liệu - tôi mất hai ngày để gỡ lỗi này! –

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