使用django-rest-framework和python-social-auth的Google身份验证

Raj*_*hil 5 django-rest-framework python-social-auth

简短的问题使用DRF,python-social-auth和Angularjs登录可在Facebook上使用,但不能在Google上使用。

我正在构建一个django应用程序,除了本地存储的电子邮件/密码组合之外,该应用程序还需要使用户能够通过Facebook和Google进行注册/登录。其工作方式如下:

  1. 对于注册和登录,Angularjs都会使用各自的app_id来启动FB和google API(FB.init和gapi.auth2.init)。页面中包含了为此所需的所有js库。
  2. 根据用户的选择,两个页面都允许用户使用Facebook或google登录或输入电子邮件/密码组合。
  3. 所有必需的信息,包括它们,access_token都是通过FB或Google的API收集的。
  4. 当用户在填写完所有相关详细信息后提交表单时(注册要求他们输入一些其他数据),包括在内的数据access_token将通过AJAX请求发送到服务器。
  5. 在服务器端,基于类的视图LoginView和SignUpView接受请求并对其进行处理。该代码直接处理基于电子邮件的注册/登录。基于Google / FB的注册/登录传递给python-social-auth的do_auth函数进行身份验证。
  6. 当提供者选择为时facebook,这可以正常工作。何时Google(同时尝试google-oauth2google-plusdo_auth最终引发403禁止错误。当相关网址https://googleapis.com/plus/v1/people/me?access_token=ACCESS_TOKEN&alt=json复制到浏览器时,它会显示错误消息:

超出了未经身份验证的使用的每日限制。继续使用需要注册

  1. 我已确保以下几点:
    1. 在Google开发人员控制台中为相应应用程序启用了Google+ API
    2. 从google开发者控制台中,添加http://localhost:5001到javascript origin字段并http://localhost:5001/social/complete重定向uri字段(稍后填充该字段。无论有没有,结果相同。)
    3. 生成密钥,并将client_id和client_secret复制到settings.SOCIAL_AUTH_GOOGLE_OAUTH2_KEYsettings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET。仔细检查了它们的准确性。
    4. 已添加'social.backends.google.GoogleOAuth2'到设置。AUTHENTICATION_BACKENDS。试图将GoogleOAuth2和GooglePlus一起放置在此处,并分开放置。
    5. 还使用PLUS(而不是OAUTH2)在2-3中进行了所有这些尝试。结果还是一样。
    6. 设置settings.SOCIAL_AUTH_USE_DEPRECATED_API为True 后再次尝试。这也将失败,但是错误现在是401。

下一步该如何使用Google身份验证?遍历了许多其他类似的问题以及Github中报告的问题。

以下是相关代码:

class SignUpView(CreateAPIView):

    def create(self, request, *args, **kwargs):
        provider = request.data['provider']
        strategy = load_strategy(request)
        backend = load_backend(strategy=strategy, name=provider, redirect_uri=None)
        token = request.data['access_token']
        try:
            user = backend.do_auth(token, user=None, **data)
        except AuthAlreadyAssociated:
            pass
Run Code Online (Sandbox Code Playgroud)

小智 5

我最近一直在努力解决类似的问题,但是由于我使用的是django-rest-framework-social-oauth2,因此情况有所不同。

首先,我注意到您启用了Google+ API,但是:

在设置中添加了“ social.backends.google.GoogleOAuth2”。AUTHENTICATION_BACKENDS。

尝试将设置更改为(这在python social auth docs中进行了描述):

AUTHENTICATION_BACKENDS = (
...
'social_core.backends.google.GooglePlusAuth',
)

SOCIAL_AUTH_GOOGLE_PLUS_KEY = '...'
SOCIAL_AUTH_GOOGLE_PLUS_SECRET = '...'
Run Code Online (Sandbox Code Playgroud)

可能对您有用的另一件事是Google oauth Playground