在我的应用程序中,我需要通过REST
API对用户进行身份验证。因此,我有一个包含用户/密码字段的表单,提交后,我想直接进入“下一个”页面。显然,我不想通过AJAX提交表单,因为我不想重定向到API页面。但是RemoteUserMiddleware
,如果请求将由javascript处理,那么如何知道我的用户应该进行身份验证?
根据我对系统体系结构的了解,您目前看起来像以下内容:
-------------- ------------------- -------------------
| client web | ----------> | REST API | ----> | db / persistent |
| browser | <---------- | pylons / nodejs | <---- | storage |
-------------- ------------------- -------------------
^ | ^ |
| | | |
| | | v
| | ----------------- -------------------
| ------------------> | django | ------> | db / persistent |
--------------------- | | <------ | storage |
----------------- -------------------
您的问题与在REST API Web应用程序中执行身份验证时如何在django应用程序上登录和注销用户有关。
我不确定RemoteUserMiddleware
您要寻找的是什么,它设计为允许在同一服务器上使用wsgi运行django时通过Apache
Web服务器层进行身份验证。该名称与REMOTE_USER
unix系统变量有关,后者是apache中的一种旧式身份验证方法。
让客户端成为django和您的REST API之间的身份验证链的中介似乎是不明智的,这似乎是天生的不安全。相反,django可以直接调用REST
API来对用户进行身份验证,然后创建一个相应的django.contrib.auth.models.User
对象以将其存储在本地,这是在自定义身份验证后端中进行的,请参见此处。
就像是:
from django.contrib.auth.models import User
import requests
class RestBackend(object):
supports_inactive_user = False
def authenticate(self, username=None, password=None):
rest_response = requests.post('http://your.rest.interface/auth',
data={ 'username' : username, 'password' : password }).json()
if rest_response['error'] == 'None':
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
user = User(username=username, password=password)
user.save()
return user
return user
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
它使用请求库通过同步的http请求来调用REST
API,以登录用户,然后创建User对象的本地实例(如果尚不存在)。有很多复杂的远程身份验证协议,如果需要,http://oauth.net/2/是一个示例。
该后端应在settings.py
文件中指定
AUTHENTICATION_BACKENDS = ('my.classy.django.app.RestBackend')
那么你的Django应用程序可以使用authenticate
和login
功能在它的观点,无论是使用HTTP或JSON,更多信息在这里。
Django会设置request.user
为类的对象AnonymousUser
,直到用户登录,文件在这里。这使您可以在视图中区分这些用户,而无需使用重定向:
from django.http import HttpResponse
from django.utils import simplejson
from myApp.models impor InfoObject
def infoPage(request):
# return info objects for logged in user, or all info objects otherwise
if request.user.is_authenticated():
infoObjects = InfoObject.objects.filter(user=request.user).orderby("-pubdate")
else:
infoObjects = InfoObject.objects.orderby("-pubdate")
return HttpResponse(simplejson.dumps(infoObjects), content_type = "application/json")
或者,如果您想在页面上显示“用户个人资料”框,则如下所示:
# helper function that can be called from all your views
def getUserInfo(request):
if request.user.is_authenticated():
return UserInfo.objects.get(user=user)
else:
return []
def randomPage(request):
info = getUserInfo(request)
.....other page logic....
return HttpResponse('['+simplejson.dumps(..pageData..)+','+simplejson.dumps(info)+']', content_type = "application/json")
相反,如果使用的是模板而不是ajax来呈现页面,则可以将此逻辑传递给模板,并在用户登录时显示区域,而不必使用重定向:
{% extends "base.html" %}
{% block userInfo %}
<div id="userArea">
{% if user.is_authenticated %}
User: {{ user.username }}<br />
geezer score: {{ userProfile.geezerScore }}<br />
<input type="button" value="log out" />
{% else %}
Username: <input type="text" id="username" />
password: <input type="password" id="password" />
<input type="button" value="log in" />
{% endif %}
</div>
{% endblock %}
这依赖于用户对象是基于视图的模板,并且需要javascript来连接身份验证后端。
也可以使用render_to_string()
模板渲染上下文,并将其返回给ajax请求而不是json。因此,无需在客户端中重新加载页面就可以在服务器上呈现html并将其返回给客户端。
通过这种方式,可以使django渲染一些模板并使用一些ajax响应来补充对REST接口的ajax请求。
这是您想要的东西吗?
我正在laravel中创建一个多身份验证系统,其中有两种类型的用户:管理员(由我创建)和用户(使用本地laravel身份验证系统)。 如果我以用户身份登录,当我尝试访问登录页面时,当我已经登录,它会将我重定向回仪表板,但如果我以管理员身份登录,当我再次访问管理员登录页面时,它会让我再次登录,尽管已经作为管理员登录。 以下是我的重定向身份验证类代码: 有人能解释一下发生了什么事吗?
遵循这个指南:https://www.youtube.com/watch?v=bqkt6eSsRZs 添加了从laravel docs的auth路由 创建登录/注册视图 创建 /home路线 自定义AuthController: 尝试访问身份验证/登录时,我遇到以下错误: 请求中出现错误异常。php第775行:。。未根据请求设置会话存储。 已将身份验证路由移动到中间件组。 成功注册,在数据库和会话
我的管理员控制器扩展了控制器类,在那里我使用方法加载视图页面并传递保护。config/auth.php也通过添加管理员保护和提供程序进行了修改。在app/Actions/Fortify文件夹中,我添加了AttemptToAuthenticate和ReDirectIfTwoFactorAuthenticate类,并更改了命名空间。我的管理员控制器还扩展了Guard。用户的重定向中间件和管理员的重定向
问题内容: 我有以下工作代码可通过本地护照策略进行身份验证: 但是,理想情况下,我想从一条快速路径处理错误和成功消息,而不是重定向到两条额外的路径。 这可能吗?我尝试使用“自定义回调”,但由于某种原因似乎在序列化用户时出错。 问题答案: 您可以使用自定义回调,例如: 在err对象中,您可以找到所有必需的错误,这些错误在身份验证时出现。
我正在尝试测试我的web api,它使用标准的Spring Securityapi进行保护。我通过实现UserDetailService实现了自己的用户身份验证服务。然而,每当我登录到我的应用程序时,/login api总是返回302重定向。我通过手动测试好的凭据和坏的凭据来验证我的登录页面是否正常工作,并且根据凭据是否良好,它确实正确地对主页进行了身份验证,但是它仍然返回了302 for/log
我正在尝试通过Google Open Auth 2.0在我的MVC 3 Web应用程序中实现身份验证。我已经成功地形成了URL请求URL,它看起来像这样: https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/userinfo.emailhttps://www.googleapis.com/a