Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
1062d71f
Commit
1062d71f
authored
Feb 25, 2013
by
swistakm
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add tests for OAuth authentication
parent
4599cd97
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
142 additions
and
3 deletions
+142
-3
rest_framework/tests/authentication.py
+142
-3
No files found.
rest_framework/tests/authentication.py
View file @
1062d71f
...
@@ -2,15 +2,19 @@ from __future__ import unicode_literals
...
@@ -2,15 +2,19 @@ from __future__ import unicode_literals
from
django.contrib.auth.models
import
User
from
django.contrib.auth.models
import
User
from
django.http
import
HttpResponse
from
django.http
import
HttpResponse
from
django.test
import
Client
,
TestCase
from
django.test
import
Client
,
TestCase
from
rest_framework
import
HTTP_HEADER_ENCODING
import
time
from
rest_framework
import
HTTP_HEADER_ENCODING
,
status
from
rest_framework
import
permissions
from
rest_framework
import
permissions
from
rest_framework.authtoken.models
import
Token
from
rest_framework.authtoken.models
import
Token
from
rest_framework.authentication
import
TokenAuthentication
,
BasicAuthentication
,
SessionAuthentication
from
rest_framework.authentication
import
TokenAuthentication
,
BasicAuthentication
,
SessionAuthentication
,
OAuthAuthentication
from
rest_framework.compat
import
patterns
from
rest_framework.compat
import
patterns
from
rest_framework.views
import
APIView
from
rest_framework.views
import
APIView
import
json
import
json
import
base64
import
base64
from
oauth_provider.models
import
Consumer
,
Resource
from
oauth_provider.models
import
Token
as
OAuthToken
from
oauth_provider
import
consts
as
oauth_consts
import
oauth2
as
oauth
class
MockView
(
APIView
):
class
MockView
(
APIView
):
permission_classes
=
(
permissions
.
IsAuthenticated
,)
permission_classes
=
(
permissions
.
IsAuthenticated
,)
...
@@ -21,11 +25,15 @@ class MockView(APIView):
...
@@ -21,11 +25,15 @@ class MockView(APIView):
def
put
(
self
,
request
):
def
put
(
self
,
request
):
return
HttpResponse
({
'a'
:
1
,
'b'
:
2
,
'c'
:
3
})
return
HttpResponse
({
'a'
:
1
,
'b'
:
2
,
'c'
:
3
})
def
get
(
self
,
request
):
return
HttpResponse
({
'a'
:
1
,
'b'
:
2
,
'c'
:
3
})
urlpatterns
=
patterns
(
''
,
urlpatterns
=
patterns
(
''
,
(
r'^session/$'
,
MockView
.
as_view
(
authentication_classes
=
[
SessionAuthentication
])),
(
r'^session/$'
,
MockView
.
as_view
(
authentication_classes
=
[
SessionAuthentication
])),
(
r'^basic/$'
,
MockView
.
as_view
(
authentication_classes
=
[
BasicAuthentication
])),
(
r'^basic/$'
,
MockView
.
as_view
(
authentication_classes
=
[
BasicAuthentication
])),
(
r'^token/$'
,
MockView
.
as_view
(
authentication_classes
=
[
TokenAuthentication
])),
(
r'^token/$'
,
MockView
.
as_view
(
authentication_classes
=
[
TokenAuthentication
])),
(
r'^auth-token/$'
,
'rest_framework.authtoken.views.obtain_auth_token'
),
(
r'^auth-token/$'
,
'rest_framework.authtoken.views.obtain_auth_token'
),
(
r'^oauth/$'
,
MockView
.
as_view
(
authentication_classes
=
[
OAuthAuthentication
]))
)
)
...
@@ -186,3 +194,134 @@ class TokenAuthTests(TestCase):
...
@@ -186,3 +194,134 @@ class TokenAuthTests(TestCase):
{
'username'
:
self
.
username
,
'password'
:
self
.
password
})
{
'username'
:
self
.
username
,
'password'
:
self
.
password
})
self
.
assertEqual
(
response
.
status_code
,
200
)
self
.
assertEqual
(
response
.
status_code
,
200
)
self
.
assertEqual
(
json
.
loads
(
response
.
content
.
decode
(
'ascii'
))[
'token'
],
self
.
key
)
self
.
assertEqual
(
json
.
loads
(
response
.
content
.
decode
(
'ascii'
))[
'token'
],
self
.
key
)
class
OAuthTests
(
TestCase
):
"""OAuth 1.0a authentication"""
urls
=
'rest_framework.tests.authentication'
def
setUp
(
self
):
self
.
csrf_client
=
Client
(
enforce_csrf_checks
=
True
)
self
.
username
=
'john'
self
.
email
=
'lennon@thebeatles.com'
self
.
password
=
'password'
self
.
user
=
User
.
objects
.
create_user
(
self
.
username
,
self
.
email
,
self
.
password
)
self
.
CONSUMER_KEY
=
'consumer_key'
self
.
CONSUMER_SECRET
=
'consumer_secret'
self
.
TOKEN_KEY
=
"token_key"
self
.
TOKEN_SECRET
=
"token_secret"
self
.
consumer
=
Consumer
.
objects
.
create
(
key
=
self
.
CONSUMER_KEY
,
secret
=
self
.
CONSUMER_SECRET
,
name
=
'example'
,
user
=
self
.
user
,
status
=
oauth_consts
.
ACCEPTED
)
self
.
resource
=
Resource
.
objects
.
create
(
name
=
"resource name"
,
url
=
"api/"
)
self
.
token
=
OAuthToken
.
objects
.
create
(
user
=
self
.
user
,
consumer
=
self
.
consumer
,
resource
=
self
.
resource
,
token_type
=
OAuthToken
.
ACCESS
,
key
=
self
.
TOKEN_KEY
,
secret
=
self
.
TOKEN_SECRET
,
is_approved
=
True
)
def
_create_authorization_header
(
self
):
params
=
{
'oauth_version'
:
"1.0"
,
'oauth_nonce'
:
oauth
.
generate_nonce
(),
'oauth_timestamp'
:
int
(
time
.
time
()),
'oauth_token'
:
self
.
token
.
key
,
'oauth_consumer_key'
:
self
.
consumer
.
key
}
req
=
oauth
.
Request
(
method
=
"GET"
,
url
=
"http://example.com"
,
parameters
=
params
)
signature_method
=
oauth
.
SignatureMethod_PLAINTEXT
()
req
.
sign_request
(
signature_method
,
self
.
consumer
,
self
.
token
)
return
req
.
to_header
()[
"Authorization"
]
def
_create_authorization_url_parameters
(
self
):
params
=
{
'oauth_version'
:
"1.0"
,
'oauth_nonce'
:
oauth
.
generate_nonce
(),
'oauth_timestamp'
:
int
(
time
.
time
()),
'oauth_token'
:
self
.
token
.
key
,
'oauth_consumer_key'
:
self
.
consumer
.
key
}
req
=
oauth
.
Request
(
method
=
"GET"
,
url
=
"http://example.com"
,
parameters
=
params
)
signature_method
=
oauth
.
SignatureMethod_PLAINTEXT
()
req
.
sign_request
(
signature_method
,
self
.
consumer
,
self
.
token
)
return
dict
(
req
)
def
test_post_form_passing_oauth
(
self
):
"""Ensure POSTing form over OAuth with correct credentials passes and does not require CSRF"""
auth
=
self
.
_create_authorization_header
()
response
=
self
.
csrf_client
.
post
(
'/oauth/'
,
{
'example'
:
'example'
},
HTTP_AUTHORIZATION
=
auth
)
self
.
assertEqual
(
response
.
status_code
,
200
)
def
test_post_form_repeated_nonce_failing_oauth
(
self
):
"""Ensure POSTing form over OAuth with repeated auth (same nonces and timestamp) credentials fails"""
auth
=
self
.
_create_authorization_header
()
response
=
self
.
csrf_client
.
post
(
'/oauth/'
,
{
'example'
:
'example'
},
HTTP_AUTHORIZATION
=
auth
)
self
.
assertEqual
(
response
.
status_code
,
200
)
# simulate reply attack auth header containes already used (nonce, timestamp) pair
response
=
self
.
csrf_client
.
post
(
'/oauth/'
,
{
'example'
:
'example'
},
HTTP_AUTHORIZATION
=
auth
)
self
.
assertIn
(
response
.
status_code
,
(
status
.
HTTP_401_UNAUTHORIZED
,
status
.
HTTP_403_FORBIDDEN
))
def
test_post_form_token_removed_failing_oauth
(
self
):
"""Ensure POSTing when there is no OAuth access token in db fails"""
self
.
token
.
delete
()
auth
=
self
.
_create_authorization_header
()
response
=
self
.
csrf_client
.
post
(
'/oauth/'
,
{
'example'
:
'example'
},
HTTP_AUTHORIZATION
=
auth
)
self
.
assertIn
(
response
.
status_code
,
(
status
.
HTTP_401_UNAUTHORIZED
,
status
.
HTTP_403_FORBIDDEN
))
def
test_post_form_consumer_status_not_accepted_failing_oauth
(
self
):
"""Ensure POSTing when consumer status is anything other than ACCEPTED fails"""
for
consumer_status
in
(
oauth_consts
.
CANCELED
,
oauth_consts
.
PENDING
,
oauth_consts
.
REJECTED
):
self
.
consumer
.
status
=
consumer_status
self
.
consumer
.
save
()
auth
=
self
.
_create_authorization_header
()
response
=
self
.
csrf_client
.
post
(
'/oauth/'
,
{
'example'
:
'example'
},
HTTP_AUTHORIZATION
=
auth
)
self
.
assertIn
(
response
.
status_code
,
(
status
.
HTTP_401_UNAUTHORIZED
,
status
.
HTTP_403_FORBIDDEN
))
def
test_post_form_with_request_token_failing_oauth
(
self
):
"""Ensure POSTing with unauthorized request token instead of access token fails"""
self
.
token
.
token_type
=
OAuthToken
.
REQUEST
self
.
token
.
save
()
auth
=
self
.
_create_authorization_header
()
response
=
self
.
csrf_client
.
post
(
'/oauth/'
,
{
'example'
:
'example'
},
HTTP_AUTHORIZATION
=
auth
)
self
.
assertIn
(
response
.
status_code
,
(
status
.
HTTP_401_UNAUTHORIZED
,
status
.
HTTP_403_FORBIDDEN
))
def
test_post_form_with_urlencoded_parameters
(
self
):
"""Ensure POSTing with x-www-form-urlencoded auth parameters passes"""
params
=
self
.
_create_authorization_url_parameters
()
response
=
self
.
csrf_client
.
post
(
'/oauth/'
,
params
)
self
.
assertEqual
(
response
.
status_code
,
200
)
def
test_get_form_with_url_parameters
(
self
):
"""Ensure GETing with auth in url parameters passes"""
params
=
self
.
_create_authorization_url_parameters
()
response
=
self
.
csrf_client
.
get
(
'/oauth/'
,
params
)
self
.
assertEqual
(
response
.
status_code
,
200
)
def
test_post_hmac_sha1_signature_passes
(
self
):
"""Ensure POSTing using HMAC_SHA1 signature method passes"""
params
=
{
'oauth_version'
:
"1.0"
,
'oauth_nonce'
:
oauth
.
generate_nonce
(),
'oauth_timestamp'
:
int
(
time
.
time
()),
'oauth_token'
:
self
.
token
.
key
,
'oauth_consumer_key'
:
self
.
consumer
.
key
}
req
=
oauth
.
Request
(
method
=
"POST"
,
url
=
"http://testserver/oauth/"
,
parameters
=
params
)
signature_method
=
oauth
.
SignatureMethod_HMAC_SHA1
()
req
.
sign_request
(
signature_method
,
self
.
consumer
,
self
.
token
)
auth
=
req
.
to_header
()[
"Authorization"
]
response
=
self
.
csrf_client
.
post
(
'/oauth/'
,
HTTP_AUTHORIZATION
=
auth
)
self
.
assertEqual
(
response
.
status_code
,
200
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment