【Django】Oauth登录过程中,如何登录该OAuth的用户。

已经获取到weibo的token,但是在绑定weibo用户和本地帐号,不知道怎么处理.

问题:

使用已绑定的weibo帐号,如何实现登录该帐号?Django自带的authenticated()/login()来登录,但是这django会限制。所以 需要怎么做才比较好。

我用得django框架, 目前的代码逻辑:

使用weibo帐号首次登录:
访问weibo, OAuth callback后,会绑定帐号: 检查uid是否已存在。若不存在,我会调用User创建instance. 然后跳转到注册页面,让用户输入密码,完成绑定。
当该用户完成绑定帐号后,再次使用weibo帐号登录。 callback后,检查uid是存在的,此时登录该账户:从 数据库中 User表中,取出绑定的web帐号. 然后使用Django自带的authenticated()/login() —— django.contrib.auth.init.py文件中的 —— 来登录,

===============================================================
在stackoverflow找到了解答(http://stackoverflow.com/questions/5775268/django-1-2-session-loss-so-hasnt-answered-this-question-successfully-yet).

 user.backend='django.contrib.auth.backends.ModelBackend'

重新设置用户的'backend'属性,然后就可以使用login()函数登录该用户。
不过还是不知其所以然。 希望可以知道这么做的原因。

阅读 10k
1 个回答

使用pdb跟了遍源码,知道了原因。

在文件 django.contrib.auth.init.py文件中,
authenticate()函数: 将普遍意义的authonrize(授权)和authenticate(用户密码核查)的事都做了. 同时赋予User实例一个新的属性backend. 这个backend的值在缺省状态下就是'django.contrib.auth.backends.ModelBackend'。
login()函数: 则是更新了session,来标记用户. 同时,使用上述的backend属性来更新session。
这样,就完成整个用户登录及其持久化.

关于backend的具体值,参考django官方文档:

Behind the scenes, Django maintains a list of “authentication backends” that it checks for authentication. When somebody calls django.contrib.auth.authenticate() – as described in How to log a user in – Django tries authenticating across all of its authentication backends. If the first authentication method fails, Django tries the second one, and so on, until all backends have been attempted.

The list of authentication backends to use is specified in the AUTHENTICATION_BACKENDS setting.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题