Facebook Auth with AngularJS and Django REST Framework

前端 未结 3 752
别那么骄傲
别那么骄傲 2021-01-30 07:25

I am developing a SPA application with AngularJS which uses Django backend for the server. The way that I communicate with the server from the SPA is with django-rest-framework.

相关标签:
3条回答
  • 2021-01-30 07:59

    Add the following line to your ObtainAuthToken class

    authentication_classes = ()
    

    and your error {"detail": "Invalid token"} will go away.

    Here's why...

    Your request contains the following header

    Authorization: Token yourAccessToken
    

    yet you have defined rest_framework.authentication.TokenAuthentication in DEFAULT_AUTHENTICATION_CLASSES.

    Based on this Django thinks you want to perform token authentication as you have passed a Token in. It fails because this is an access token for facebook and doesn't exist in your django *_token database, hence the invalid token error. In your case all you need to do is tell Django not to use TokenAuthentication for this view.

    FYI

    Keep in mind you may encounter further errors as your code execution was halted before the post method of ObtainAuthToken executed. Personally when trying to step through your code I got the error

    'DjangoStrategy' object has no attribute 'backend'
    

    on

    backend = request.strategy.backend
    

    and resolved it by changing to

    uri = ''
    strategy = load_strategy(request)
    backend = load_backend(strategy, backend, uri)
    

    Additionally you should update your you register_by_access_token function as it doesn't line up with the working code from the blog you referenced. The blog author posted his latest code here. Your version doesn't pull the token out of the auth header which is required if you want to use it to auth with a third party like facebook.

    0 讨论(0)
  • 2021-01-30 08:05

    Yea. Solved. The settings are not right and you need to add permissions.

     REST_FRAMEWORK = {
         # Use hyperlinked styles by default.
         # Only used if the `serializer_class` attribute is not set on a view.
         'DEFAULT_MODEL_SERIALIZER_CLASS':
             'rest_framework.serializers.HyperlinkedModelSerializer',
    
         # Use Django's standard `django.contrib.auth` permissions,
         # or allow read-only access for unauthenticated users.
         'DEFAULT_PERMISSION_CLASSES': [
             'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
         ]
     }
    

    and some info about pipeline:

     SOCIAL_AUTH_PIPELINE = (
         'social.pipeline.social_auth.social_details',
         'social.pipeline.social_auth.social_uid',
         'social.pipeline.social_auth.auth_allowed',
         'social.pipeline.social_auth.social_user',
         'social.pipeline.user.get_username',
         'social.pipeline.social_auth.associate_by_email',
         'social.pipeline.user.create_user',
         'social.pipeline.social_auth.associate_user',
         'social.pipeline.social_auth.load_extra_data',
         'social.pipeline.user.user_details'
     )
    
    0 讨论(0)
  • 2021-01-30 08:05

    I'm using tools just like you, but I provide my login/register/.... with django-allauth package, and then use django-rest-auth for API handling.

    You just need follow the installation instruction, then use them for your rest APIs.

    Adding allauth and rest-auth to your INSTALLED_APPS:

    INSTALLED_APPS = (
        ...,
        'rest_framework',
        'rest_framework.authtoken',
        'rest_auth'
        ...,
        'allauth',
        'allauth.account',
        'rest_auth.registration',
        ...,
        'allauth.socialaccount',
        'allauth.socialaccount.providers.facebook',
    )
    

    Then add your custom urls:

    urlpatterns = patterns('',
        ...,
        (r'^auth/', include('rest_auth.urls')),
        (r'^auth/registration/', include('rest_auth.registration.urls'))
    )
    

    Finally, add this line:

    TEMPLATE_CONTEXT_PROCESSORS = (
        ...,
        'allauth.account.context_processors.account',
        'allauth.socialaccount.context_processors.socialaccount',
        ...
    )
    

    These two packages works like a charm, and you don't need to have concern about any type of login.registration, because allauth package handles both django model login and oAuth login.

    I hope it helps

    0 讨论(0)
提交回复
热议问题