python - 如何在使用 django social_auth 登录 google oauth 后打开原始页面

标签 python django oauth

我正在使用 django social_auth 进行用户身份验证,它在用户首次登录时效果很好。但是,如果访问 token 过期或直接通过 url 打开页面,用户将在 google oauth 后重定向到默认页面('/')。 google oauth 登录后如何获取原始页面?

这是我的设置.py:

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_extensions',    
'bootstrap3',
'djangobower',
'social_auth',
)

AUTHENTICATION_BACKENDS = (
    'social_auth.backends.google.GoogleOAuth2Backend',
    'django.contrib.auth.backends.ModelBackend',
)

SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/'
GOOGLE_OAUTH2_CLIENT_ID = 'CLIENT_ID'
GOOGLE_OAUTH2_CLIENT_SECRET = 'CLIENT_SECRET'
SOCIAL_AUTH_USER_MODEL = 'auth.User'
SESSION_SERIALIZER='django.contrib.sessions.serializers.PickleSerializer'
GOOGLE_WHITE_LISTED_DOMAINS = ['google.com']

SOCIAL_AUTH_GOOGLE_OAUTH2_AUTH_EXTRA_ARGUMENTS = {
    'access_type': 'offline',
    'approval_prompt': 'select_account+consent',
    'prompt' : 'select_account+consent'
}

登录.html:

{% load bootstrap3 %}
{% load static %}
<link media="all" href="{% static 'bootstrap/dist/css/bootstrap.min.css' %}" type="text/css" rel="stylesheet"/>
<script type="text/javascript" src='{% static 'bootstrap/dist/js/bootstrap.min.js' %}'></script>
{% load static %}    
<script type="text/javascript" src='{% static 'jquery/jquery.js' %}'></script>
<link media="all" href="{% static 'dashboard.css' %}" type="text/css" rel="stylesheet"/>
<script src='{% static 'canvasjs/canvasjs.min.js' %}' type="text/javascript"></script>
<link rel="stylesheet" href="{% static 'signin.css' %}" /> 

{% if form.errors %}
<p text-align="center">Your username and password didn't match. Please try again. {{form.errors}} </p>
{% endif %}

<form method="post" action="{% url 'django.contrib.auth.views.login' %}" class="form-signin" role="form">
{% csrf_token %}
<h2 class="form-signin-heading">ABC Website</h2>
<input id="id_username" maxlength="254" name="username" type="text" class="form-control" placeholder="Username" autofocus/>
<input id="id_password" name="password" type="password" class="form-control" placeholder="Password"/>
<button class="btn btn-lg btn-primary btn-block" type="submit">System Account LogIn</button>
<input type="hidden" name="next" value="{{ next }}" />
</form>

<p style="text-align: center"><a href="{% url "socialauth_begin" "google-oauth2" %}?prompt=select_account+consent">GMail Login</a></p>

urls.py:

url(r'^accounts/login/$', 'django.contrib.auth.views.login'),
url(r'^accounts/logout/$', login_required(views.logout_view), name = "logout"),    
url(r'^complete/(?P<backend>[^/]+)/$', views.AuthComplete.as_view()),
url(r'^login-error/$', views.LoginError.as_view(), 'login-error'),
url(r'', include('social_auth.urls')),    
url(r'^admin/', include(admin.site.urls)),

最佳答案

在您的 html 模板中,您可以在登录按钮中使用它来重定向到同一页面:

href="{% url 'social:begin' 'google-oauth2' %}?next={{ request.path }}"

“next=”指定登录后链接到下一个的位置。因此“next={{ request.path }}”链接到与原始请求相同的路径。

如果您只是重定向到主页,那么只需使用“next=/”:

href="{% url 'social:begin' 'google-oauth2' %}?next=/"

关于python - 如何在使用 django social_auth 登录 google oauth 后打开原始页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31266521/

相关文章:

python - Flask-Classy/Flask-Classful 中的子路由

mysql - 没有数据库关系的ForeignKey和ManyToMany

python - Django中抽象模型相关的ForeignKey字段

django - 使用来自 django 应用程序的 kafka 消息

API认证设计

android - 在这个简单的 Android 应用程序案例中,我需要从 OAuth 2.0 获得什么?

python - Authlib jwt token 解码在函数内部不起作用

python - 在 scipy.ndimage 中应用旋转后获得不同的范围

javascript - Slack oauth.access API 返回 bad_redirect_uri 而不请求 redirect_uri

python - 从真值表 pandas 中提取数据