Skip to content
This repository has been archived by the owner on Nov 5, 2019. It is now read-only.

Commit

Permalink
Add Django Samples
Browse files Browse the repository at this point in the history
Contains two sets of samples - one for the
“Google auth” system and one for the “Django
user auth” system.
  • Loading branch information
Bill Prin committed Aug 20, 2016
1 parent 5315cd9 commit e204ca8
Show file tree
Hide file tree
Showing 24 changed files with 615 additions and 0 deletions.
17 changes: 17 additions & 0 deletions samples/django/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Django Samples

These two sample Django apps provide a skeleton for the two main use cases of the
Django contrib helpers

## google_user

This is the simpler use case of the library and assumes you are using Google OAuth as your primary
authorization and authentication mechanism for your app. Users log in with their Google ID and
their OAauth2 credentials are stored inside the session. Please see the core docs for
usage examples.

## django_user

This is the use case where the application is already using the Django authorization system and
has a Django model with a `django.contrib.auth.models.User` field, and would like to attach
a Google OAuth2 credentials object to that model. Please see the core docs for usage examples.
10 changes: 10 additions & 0 deletions samples/django/django_user/manage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myoauth.settings")

from django.core.management import execute_from_command_line

execute_from_command_line(sys.argv)
Empty file.
117 changes: 117 additions & 0 deletions samples/django/django_user/myoauth/settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'eiw+mvmua#98n@p2xq+c#liz@r2&#-s07nkgz)+$zcl^o4$-$o'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
'oauth2client.contrib.django_util'

)

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'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',
'django.middleware.security.SecurityMiddleware',
)

ROOT_URLCONF = 'myoauth.urls'

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

WSGI_APPLICATION = 'myoauth.wsgi.application'

# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/

STATIC_URL = '/static/'

GOOGLE_OAUTH2_CLIENT_ID = 'YOUR_CLIENT_ID'

GOOGLE_OAUTH2_CLIENT_SECRET = 'YOUR_CLIENT_SECRET'

GOOGLE_OAUTH2_SCOPES = ('email', 'https://www.googleapis.com/auth/calendar',
'profile')

GOOGLE_OAUTH2_STORAGE_MODEL = {
'model': 'polls.models.CredentialsModel',
'user_property': 'user_id',
'credentials_property': 'credential'
}

LOGIN_URL = '/login'
31 changes: 31 additions & 0 deletions samples/django/django_user/myoauth/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from django.conf.urls import include, url
from django.contrib import admin
import django.contrib.auth.views
from polls.views import get_profile_optional, get_profile_required, index

from oauth2client.contrib.django_util.site import urls as oauth2_urls


urlpatterns = [
url(r'^$', index),
url(r'^profile_required$', get_profile_required),
url(r'^profile_enabled$', get_profile_optional),
url(r'^admin/', include(admin.site.urls)),
url(r'^login', django.contrib.auth.views.login, name="login")
]

urlpatterns += [url(r'^oauth2/', include(oauth2_urls))]
21 changes: 21 additions & 0 deletions samples/django/django_user/myoauth/wsgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myoauth.settings")

application = get_wsgi_application()
Empty file.
34 changes: 34 additions & 0 deletions samples/django/django_user/polls/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from django.contrib.auth.models import User
from django.db import models

from oauth2client.contrib.django_util.models import CredentialsField


class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')


class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)


class CredentialsModel(models.Model):
user_id = models.OneToOneField(User)
credential = CredentialsField()
1 change: 1 addition & 0 deletions samples/django/django_user/polls/templates/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Hello world
47 changes: 47 additions & 0 deletions samples/django/django_user/polls/templates/registration/login.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{#
# Copyright 2016 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#}

{% if form.errors %}
<p>Your username and password didn't match. Please try again.</p>
{% endif %}

{% if next %}
{% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed,
please login with an account that has access.</p>
{% else %}
<p>Please login to see this page.</p>
{% endif %}
{% endif %}

<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<table>
<tr>
<td>{{ form.username.label_tag }}</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>{{ form.password.label_tag }}</td>
<td>{{ form.password }}</td>
</tr>
</table>

<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next }}" />
</form>


44 changes: 44 additions & 0 deletions samples/django/django_user/polls/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Copyright 2016 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from django.http import HttpResponse
from django.template import loader

from oauth2client.contrib.django_util.decorators import (
oauth_enabled, oauth_required)


def index(request):
template = loader.get_template('index.html')
return HttpResponse(template.render({}, request))


@oauth_required
def get_profile_required(request):
resp, content = request.oauth.http.request(
'https://www.googleapis.com/plus/v1/people/me')
return HttpResponse(content)


@oauth_enabled
def get_profile_optional(request):
if request.oauth.has_credentials():
# this could be passed into a view
# request.oauth.http is also initialized
return HttpResponse("User email: %s"
% request.oauth.credentials.id_token['email'])
else:
return HttpResponse('Here is an OAuth Authorize link:'
'<a href="%s">Authorize</a>'
% request.oauth.get_authorize_redirect())
3 changes: 3 additions & 0 deletions samples/django/django_user/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Django==0.10.0
oauth2client==
jsonpickle==0.9.3
10 changes: 10 additions & 0 deletions samples/django/google_user/manage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myoauth.settings")

from django.core.management import execute_from_command_line

execute_from_command_line(sys.argv)
Empty file.
Loading

0 comments on commit e204ca8

Please sign in to comment.