Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调节django_openid_auth_Django_Openid_Django Authentication_Django Authopenid - Fatal编程技术网

如何调节django_openid_auth

如何调节django_openid_auth,django,openid,django-authentication,django-authopenid,Django,Openid,Django Authentication,Django Authopenid,我正在使用django_openid_auth库实现openid特性,这非常令人惊讶。。 然而,我正在寻找非常具体的缓和设置 虽然openid对每个人都可用,但我希望实现以下规则 OpenId应提供电子邮件地址。。不是所有的男人都能提供 电子邮件地址应该是my db中存在的访问授权列表之一 我开始考虑一些可能的方法,比如创建自定义中间件、自定义登录所需的装饰器等。。不过,我想不出一个可行的办法,可以把它们完全纳入条例草案内 如果有人能提出建议,我们将不胜感激获取电子邮件地址非常简单-您只需向

我正在使用django_openid_auth库实现openid特性,这非常令人惊讶。。 然而,我正在寻找非常具体的缓和设置

虽然openid对每个人都可用,但我希望实现以下规则

  • OpenId应提供电子邮件地址。。不是所有的男人都能提供
  • 电子邮件地址应该是my db中存在的访问授权列表之一
我开始考虑一些可能的方法,比如创建自定义中间件、自定义登录所需的装饰器等。。不过,我想不出一个可行的办法,可以把它们完全纳入条例草案内


如果有人能提出建议,我们将不胜感激

获取电子邮件地址非常简单-您只需向openid服务器索取即可。django openid auth为其提供设置:

OPENID_SREG_EXTRA_FIELDS = ['email']
在我的项目中,我还需要在认证后做额外的工作。我用信号解决了它:

def register_login_signal():
    from django.contrib.auth.signals import user_logged_in
    from django.contrib.auth.models import User
    user_logged_in.connect(your_function_name_here, sender = User)

def your_function_name_here(sender, **kwargs):
        request = kwargs.get('request')
        logout(request) if request.user.email not in your_list_of_authenticated_emails else pass
别忘了把register\u login\u signal()放在某个地方,像projectsinit.py文件一样使用它

编辑:

第一条评论/问题

文件中未说明额外字段部分。另外,如果你浏览github包,我敢肯定,你会发现没有类似的东西。我使用的是旧版本的。下载它,解包并打开django openid auth文件夹中的views.py。搜索OPENID\u SREG\u EXTRA\u字段,您将看到它。如果您在settings.py中定义它,它就像一个符咒

第二项问题

异步的?不,不是真的。异步将是在当前函数堆栈之外运行的东西——如果您可以这样描述它的话。这不是那样的。想象一下,在登录函数的末尾有一个检查,如果有一些函数连接在登录函数的末尾。他们马上就跑了。它和django中间件一样异步。所以一点也不

但这是正确的地方吗?我设想您已经设置好了站点,您可以检查用户是否使用@login\u required decorator或类似的东西登录

让我们看看事情将如何执行:

1) openid服务器向您发送上次请求时请求的所有信息

2) django openid auth login_complete视图接管并使用其后端对用户进行身份验证

3) 在这一过程的最后,你所听到的信号被触发,用户的电子邮件将根据你的列表进行检查,如果检查失败,他将立即注销

4) 由于视图已完成,它会自动将您重定向到原始视图中使用“next”参数指定的url或登录设置中指定的url

5) 在此之前,所有的中间件和装饰器都会被使用。若您使用了@login\u required decorator之类的东西(这对于每个受登录保护的页面来说都是明智之举),那个么它会立即将用户重定向到登录页面。如果您费心在信号中添加某种消息以请求,则会显示该消息(假定您的登录/注销页面支持该消息)

最后要说的是,没有比登出更有效的方法了


/edit

您能指出他们在文档中提到的
OPENID\u SREG\u EXTRA\u字段的位置吗?好的,关于身份验证。。如果用户不在此列表中,则每次登录时您都试图注销。。这是异步代码。这不会使回复立即生效。。我们不知道。。你认为依赖异步代码好吗?更重要的是,我认为我们需要选择一个比注销更强大的机制。这很好用。。还有一个问题。注销的问题是,用户可以正式向我们注册,数据库中仍然有他的数据。。有没有可能在这之前处理好这种情况?对不起,我不明白你的意思,注册如何适应这个过程。我想你需要多解释一下这种情况。