3

I'm using django-rest-auth with django-all-auth on DRF and Angularjs. On any request regarding auth, I get the following error:

{"detail":"Authentication credentials were not provided."}

Going through SO, i've realised there are a lot of similar problems so accumulating them together, I tried the following:

settings.py

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    ...
    'rest_framework',
    'rest_framework.authtoken',
    'rest_auth',
    ...
    'allauth',
    'allauth.account',
    'rest_auth.registration',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.facebook',

)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

DEFAULT_AUTHENTICATION = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.OAuth2Authentication',
        'rest_framework.authentication.TokenAuthentication',
    ),
}
REST_FRAMEWORK = {
   'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAdminUser'
   ),
}
AUTHENTICATION_BACKENDS = (
    "django.contrib.auth.backends.ModelBackend",
    "allauth.account.auth_backends.AuthenticationBackend"
)
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.request",
    "django.contrib.auth.context_processors.auth",
    "allauth.account.context_processors.account",
    "allauth.socialaccount.context_processors.socialaccount",
)

REST_SESSION_LOGIN = False

My app.js file

sgApp.config(['$routeProvider','$locationProvider', '$httpProvider',
    function($routeProvider, $locationProvider, $httpProvider){
        $routeProvider.when('/',{
            templateUrl: '/static/partials/index.html',
            controller: 'indexCtrl'
        }).when('/abc',{
            templateUrl: 'static/partials/index.html'
        }).otherwise({
            redirectTo: '/'
        });
        $locationProvider.html5Mode(true).hashPrefix('!');
        $httpProvider.defaults.xsrfCookieName = 'csrftoken';
        $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
    }
]).controller('someCtrl', function($scope, $http, $httpProvider){
       $scope.login = function() {
           Facebook.login(function(response) {
            var postDict = {
                access_token: response.authResponse.accessToken
            }
            $http.post('/sgAuth/facebook/', postDict).
                success(function(data){
                    $httpProvider.defaults.headers.common.Authorization = 'Token ' + data.key;
                    $scope.loggedIn = true;
                    $scope.userDetails(); //function that gets user details
                });
        });
    };
});

Where am I going wrong?

mariodev
  • 13,928
  • 3
  • 49
  • 61
Newtt
  • 6,050
  • 13
  • 68
  • 106
  • Does logging in work? Can you see the `data.token` if you log it to the console? Does the `Token` header appear in the request if you look in your browser's developer tools (F12)? – Kevin Brown-Silva Mar 13 '15 at 23:46
  • @KevinBrown, it is very arbitrary. It'll work sometimes, but it won't logout. And if it does logout, I can't login again. – Newtt Mar 14 '15 at 04:52
  • Just to factor it out, I would try adding a console.log(response.authResponse.accessToken) before your call to your own API login. I would also make sure your Token is populating correctly as suggested by Kevin Brown. If FB is working correctly but your token is missing, then you need to check out your logs. – Titus P Mar 14 '15 at 09:15
  • I have the same issue here. – Italo Maia May 26 '15 at 03:51
  • @ItaloMaia, Hey, what's the problem you're facing? I sort of fixed it, so I might be able to help you out. – Newtt May 26 '15 at 09:00

2 Answers2

1

I had same problem in your line:

$httpProvider.defaults.headers.common.Authorization = 'Token ' + data.key;

Try this:

httpProvider.defaults.headers.common.Authorization = 'JWT ' + data.key;

Regards.

Fer Mena
  • 273
  • 2
  • 12
0

You have permission class in your settings:

REST_FRAMEWORK = {
   'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAdminUser'
   ),
}

So only requests made by admin user are going through.

DevilPinky
  • 558
  • 3
  • 13