django-rest-social-auth, 带有 Django rest框架的OAuth登录

分享于 

17分钟阅读

GitHub

  繁體 雙語
OAuth signin with django rest framework
  • 源代码名称:django-rest-social-auth
  • 源代码网址:http://www.github.com/st4lk/django-rest-social-auth
  • django-rest-social-auth源代码文档
  • django-rest-social-auth源代码下载
  • Git URL:
    git://www.github.com/st4lk/django-rest-social-auth.git
    Git Clone代码到本地:
    git clone http://www.github.com/st4lk/django-rest-social-auth
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/st4lk/django-rest-social-auth
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    Django REST社会认证

    Build StatusCoverage StatusPypi version

    带有 Django rest框架的OAuth登录。

    要求

    • python ( 2.7.3.4.3.5.3.6 )
    • Django ( 1.8.1.9.1.10.1.10 )
    • djangorestframework (> =3。1,<4.0 )
    • social-auth-core (> =0.2.1.<2.0 )
    • social-auth-app-django (> =0.1.0.<2.0 )
    • [optional] djangorestframework-jwt (> =1.7.2 )

    发行说明

    这里是

    动机

    要拥有一个资源,那将是非常简单的事情: 从社交提供商( 例如 facebook ) 获取oauth代码并返回经过认证的用户。 完成。

    我找不到 Django rest框架这样的util。 有( 例如 django-rest-auth ) 包,采用 access_token,而不是代码。 另外,我曾经使用过awesome库 python-social-auth插件,所以再次使用它将非常不错。 实际上,大部分工作都是由这个包完成的。 当前的util为集成django-rest-framework和python-social-auth带来了一点帮助。

    快速启动

    将这里软件包安装到你的python 发行版中:

    
     pip install rest-social-auth
    
    
    
    

    设置设置

    安装应用程序

    
     INSTALLED_APPS = (
    
    
    . . .
    
    
     'rest_framework',
    
    
     'rest_framework.authtoken', # only if you use token authentication
    
    
     'social_django', # django social auth
    
    
     'rest_social_auth', # this package
    
    
     )
    
    
    
    

    社会认证设置,查看文档,了解详情

    
     SOCIAL_AUTH_FACEBOOK_KEY = 'your app client id'
    
    
     SOCIAL_AUTH_FACEBOOK_SECRET = 'your app client secret'
    
    
     SOCIAL_AUTH_FACEBOOK_SCOPE = ['email', ] # optional
    
    
     SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {'locale': 'ru_RU'} # optional
    
    
    
     AUTHENTICATION_BACKENDS = (
    
    
     'social_core.backends.facebook.FacebookOAuth2',
    
    
     # and maybe some others.. .
    
    
     'django.contrib.auth.backends.ModelBackend',
    
    
     )
    
    
    
    

    还可以查看可选设置

    确保一切都完成了

    
     python manage.py migrate
    
    
    
    

    包括rest社交网址( 至少选择一个)

    4.1 会话身份验证插件

    
     url(r'^api/login/', include('rest_social_auth.urls_session')),
    
    
    
    

    4.2 令牌身份验证插件

    
     url(r'^api/login/', include('rest_social_auth.urls_token')),
    
    
    
    

    4.3 jwt身份验证协议

    
     url(r'^api/login/', include('rest_social_auth.urls_jwt')),
    
    
    
    

    你已经准备好登录用户

    下面是 OAuth 2.0的示例。

    5.1 会话身份验证

    • 发布/api/login/social/session/

      输入:

      
       {
      
      
      "provider":"facebook",
      
      
      "code":"AQBPBBTjbdnehj51"
      
      
       }
      
      
      
      

      输出:

      
       {
      
      
      "username":"Alex",
      
      
      "email":"user@email.com",
      
      
      //other user data
      
      
       }
      
      
      
       + session id in cookies
      
      
      
      

    5.2 令牌身份验证

    • 发布/api/login/social/token/

      输入:

      
       {
      
      
      "provider":"facebook",
      
      
      "code":"AQBPBBTjbdnehj51"
      
      
       }
      
      
      
      

      输出:

      
       {
      
      
      "token":"68ded41d89f6a28da050f882998b2ea1decebbe0"
      
      
       }
      
      
      
      
    • 发布/api/login/social/token_user/

      输入:

      
       {
      
      
      "provider":"facebook",
      
      
      "code":"AQBPBBTjbdnehj51"
      
      
       }
      
      
      
      

      输出:

      
       {
      
      
      "username":"Alex",
      
      
      "email":"user@email.com",
      
      
      //other user data
      
      
      "token":"68ded41d89f6a28da050f882998b2ea1decebbe0"
      
      
       }
      
      
      
      

    5.3 jwt身份验证

    • 发布/api/login/social/jwt/

    • 发布/api/login/social/jwt_user/

      令牌身份验证类似,但令牌是JSON网络令牌。

      有关详细信息,请参阅 JWT.io

      要使用它,必须安装 django-rest-framework-jwt插件。

    用户模型取自 settings.AUTH_USER_MODEL

    在输入时也没有必要的字段 redirect_uri。 如果给定,服务器将在请求中使用这里重定向 uri,而不是从设置获得。 这里redirect_uri在前端请求和后端请求中必须相等。 后端实际上不会做任何重定向。

    也可以在url中指定提供程序,而不是在请求正文中指定提供程序。 只需将它的附加到 url:

    
     POST/api/login/social/session/facebook/
    
    
    
    

    现在不需要在体内指定它:

    
     {
    
    
    "code":"AQBPBBTjbdnehj51"
    
    
     }
    
    
    
    

    带有rest-social-auth的OAuth 2.0工作流

    前端需要了解每个社会提供者的以下参数:

    • 仅在 OAuth 2.0的情况下,在社交服务提供商的注册应用程序中注册的#。
    • 这个网址社交提供程序将用代码重定向。
    • 例如电子邮件地址( 例如电子邮件)。
    • 对于所有 oauth2.0 提供程序,response_type=code # 相同。

    前端重定向用户到社会授权网址上的参数。

    用户确认。

    社交提供程序使用参数 code 重定向回 redirect_uri

    前端已经准备好登录用户。 为此,向提供程序 NAME 和代码发送POST请求:

    
     POST/api/login/social/session/
    
    
    
    

    使用数据( 表单数据或者 json )

    
     provider=facebook&code=AQBPBBTjbdnehj51
    
    
    
    

    后端将登录用户,或者注册,返回错误。

    有时更适合在url中指定提供程序,而不是在请求正文中指定提供程序。 有可能rest-social-auth会理解的。 以下请求与上述请求相同:

    
     POST/api/login/social/session/facebook/
    
    
    
    

    使用数据( 表单数据或者 json )

    
     code=AQBPBBTjbdnehj51
    
    
    
    

    OAuth: 一个带有的工作流

    前端需要通过提供程序 NAME 向后端发出POST请求:

    
     POST/api/login/social/
    
    
    
    

    使用数据( 表单数据或者 json ):

    
     provider=twitter
    
    
    
    

    或者在url中指定提供程序,在这种情况下,数据将为空:

    
     POST/api/login/social/twitter
    
    
    
    

    后端将在响应中返回一个短生存的oauth_token 请求令牌。 前端可以用于与提供程序执行身份验证。

    在 Twitter的情况下,用户将返回以下数据到你的前端:

    
     {
    
    
    "redirect_state":"...bHrz2x0wy43",
    
    
    "oauth_token" :"...AAAAAAAhD5u",
    
    
    "oauth_verifier":"...wDBdTR7CYdR"
    
    
     }
    
    
    
    

    前端已经准备好登录用户。 要完成这里操作,请再次使用提供程序 NAME 和从提供程序获得的oauth_tokenoauth_verifier 发送POST请求:

    
     POST/api/login/social/
    
    
    
    

    使用数据( 表单数据或者 json )

    
     provider=twitter&oauth_token=AQBPBBTjbdnehj51&oauth_verifier=wDBdTR7CYdR
    
    
    
    

    后端将登录用户,注册或者返回错误。 OAuth 2.0中一样,你可以在url中指定提供程序,而不是在正文中指定提供程序:

    
     POST/api/login/social/twitter
    
    
    
    

    这里流程与 satellizer 中描述的相同。 这里angularjs的MODULE 在示例项目中使用。

    注释

    如果你使用令牌( 或者 jwt ) 认证和 OAuth 1.0,那么仍然需要'django.contrib.sessions'应用程序(。OAuth 2.0和令牌认证不需要它)。 这是因为python-social-auth将在请求之间存储一些数据到 OAuth 1.0提供者之间。

    rest-social-auth目

    我们可以看到,后端必须实现用于登录用户的资源。

    Django REST社会认证提供了轻松实现此类资源的方法。

    oauth提供程序列表

    支持 OAuth 1.0和 OAuth 2.0提供程序。

    查看 python-social-auth 完整列表。 提供程序的NAME 从python-social-auth中特定的备份类的相应 backend.name 属性获取。

    例如对于 facebook后端,我们可以看到:

    
    class FacebookOAuth2(BaseOAuth2):
    
    
     name = 'facebook'
    
    
    
    

    以下是一些提供程序名称:

    提供程序提供程序名称
    Facebookfacebook
    谷歌google-oauth2
    Vkontaktevk-oauth2
    Instagraminstagram
    Githubgithub
    Yandexyandex-oauth2
    Twittertwitter
    其他人

    设置

    • REST_SOCIAL_OAUTH_REDIRECT_URI

      默认值:'/'

      定义 redirect_uri。这里重定向在授权请求( 由前端制作) 和访问令牌请求( 由后端制作) 中都必须相同。

      要覆盖相对路径( 支持url路径或者 url NAME ),请执行以下操作:

      
       REST_SOCIAL_OAUTH_REDIRECT_URI = '/oauth/redirect/path/'
      
      
       # or url name
      
      
       REST_SOCIAL_OAUTH_REDIRECT_URI = 'redirect_url_name'
      
      
      
      

      注意,在 url NAME的情况下,将向url解析器提供后端 NAME 作为参数。

    • REST_SOCIAL_DOMAIN_FROM_ORIGIN

      默认值:True

      有时前端和后端在不同的域上运行。 例如'myproject.com',的前端和'api.myproject.com'.的后端

      如果 true,域将从请求原点获取,如果定义了 origin。 因这里在当前的示例域中将是'myproject.com', 不是'api.myproject.com'.,这个域将与 REST_SOCIAL_OAUTH_REDIRECT_URI 设置的路径联接。

      要清楚,假设我们有以下设置( 默认值):

      
       REST_SOCIAL_OAUTH_REDIRECT_URI = '/'
      
      
       REST_SOCIAL_DOMAIN_FROM_ORIGIN = True
      
      
      
      

      前端在'myproject.com', 后端运行- 在'api.myproject.com'. 后端将使用以下 redirect_uri:

       
       myproject.com/
      
      
      
       

      以及以下设置:

      
       REST_SOCIAL_OAUTH_REDIRECT_URI = '/'
      
      
       REST_SOCIAL_DOMAIN_FROM_ORIGIN = False
      
      
      
      

      redirect_uri将为:

      
       api.myproject.com/
      
      
      
      

      如果这样的架构是你的案例,也看看 django-cors-headers。

    • REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI

      默认值:None

      完全重定向 uri ( 域和路径) 可以硬编码

      
       REST_SOCIAL_OAUTH_ABSOLUTE_REDIRECT_URI = 'http://myproject.com/'
      
      
      
      

      这里设置比 REST_SOCIAL_OAUTH_REDIRECT_URIREST_SOCIAL_DOMAIN_FROM_ORIGIN 具有更高的优先级。 换句话说,如果定义了这里设置,则将忽略其他设置。 但是来自请求的redirect_uri 参数具有高于任何设置的优先级。

    • REST_SOCIAL_LOG_AUTH_EXCEPTIONS

      默认值:True

      False 不记录社会认证认证异常时。

    文档级自定义项

    首先,python-social-auth提供的定制也可用。 例如在登录/登录过程中,使用 pipeline的良好机制来执行任何需要的操作。

    其次,你可以覆盖当前包中的任何方法。 通过子类化视图为每个视图指定序列化程序。

    来做

    • 定义你自己的网址:

      
       url(r'^api/login/social/$', MySocialView.as_view(), name='social_login'),
      
      
      
      
    • 定义序列化程序

      
       from rest_framework import serializers
      
      
       from django.contrib.auth import get_user_model
      
      
      
       class MyUserSerializer(serializers.ModelSerializer):
      
      
      
       class Meta:
      
      
       model = get_user_model()
      
      
       exclude = ('password', 'user_permissions', 'groups')
      
      
      
      
    • 定义视图

      
       from rest_social_auth.views import SocialSessionAuthView
      
      
       from. serializers import MyUserSerializer
      
      
      
       class MySocialView(SocialSessionAuthView):
      
      
       serializer_class = MyUserSerializer
      
      
      
      

    检查库的代码,没有太多。

    示例

    有一个示例项目示例。

    • 确保已经安装 rest-social-auth

      
       pip install rest-social-auth
      
      
      
      
    • 克隆 repo

      
       git clone https://github.com/st4lk/django-rest-social-auth.git
      
      
      
      
    • 在 example_project/中步骤

      
       cd django-rest-social-auth/example_project
      
      
      
      
    • 创建数据库( )

      
       python manage.py syncdb
      
      
      
      
    • 运行开发服务器

      
       python manage.py runserver
      
      
      
      

    示例项目已经包含 facebook。谷歌和 Twitter 应用id和秘密。 这些应用程序被配置为只使用 restsocialexample.com 域( 某些提供商不支持 localhost )。 因此,要使用它,在你的主机中定义这里域为 localhost:

    
    127.0.0.1 restsocialexample.com
    
    
    
    

    并访问 http://restsocialexample.com:8000/

    示例项目使用 satellizer angularjs模块。

    贡献者


    相关文章