Django OAuth2 错误:提供了 client_id 时,invalid_client 和 client_id=None

Posted

技术标签:

【中文标题】Django OAuth2 错误:提供了 client_id 时,invalid_client 和 client_id=None【英文标题】:Django OAuth2 Error: invalid_client and client_id=None when client_id has been provided 【发布时间】:2013-10-06 12:26:02 【问题描述】:

我正在使用 django-social-auth 为我的 django 项目进行谷歌应用程序身份验证。我从 Google api 控制台为我的域获取了客户端 ID 和密钥。并将值插入我的应用程序中,如下所示:

    **settings.py**

      MIDDLEWARE_CLASSES = (
      'social_auth.middleware.SocialAuthExceptionMiddleware',
      )

     LOGIN_URL = '/login/google-oauth2/'
     LOGIN_REDIRECT_URL = '/profile'
     LOGIN_ERROR_URL = '/login-error/'

     AUTHENTICATION_BACKENDS = (
      'social_auth.backends.google.GoogleOAuth2Backend',
      'django.contrib.auth.backends.ModelBackend',
     )

    TEMPLATE_CONTEXT_PROCESSORS = (
     "django.contrib.auth.context_processors.auth",
     "social_auth.context_processors.social_auth_by_type_backends",
    )

    SOCIAL_AUTH_ENABLED_BACKENDS = ('google',)
    SOCIAL_AUTH_DEFAULT_USERNAME = 'new_social_auth_user'

    GOOGLE_OAUTH2_CLIENT_ID = '***.apps.googleusercontent.com'
    GOOGLE_OAUTH2_CLIENT_SECRET = '****'
    GOOGLE_WHITE_LISTED_DOMAINS = ['127.0.0.1:8000']

    SOCIAL_AUTH_COMPLETE_URL_NAME  = 'socialauth_complete'
    SOCIAL_AUTH_ASSOCIATE_URL_NAME = 'socialauth_associate_complete'
    SOCIAL_AUTH_RAISE_EXCEPTIONS = False
    SOCIAL_AUTH_PROCESS_EXCEPTIONS = 'social_auth.utils.log_exceptions_to_messages'  

    INSTALLED_APPS = (
            'social_auth', )

...

    **urls.py**

     from django.conf.urls import patterns, include, url
     from django.contrib import admin
     from django.views.generic import TemplateView
     from django.contrib.auth.views import logout
     admin.autodiscover()

     urlpatterns = patterns('',

     url(r'^admin/', include(admin.site.urls)),
     url(r'', include('social_auth.urls')),
     url(r'^$', TemplateView.as_view(template_name="login.html")),                 
     url(r'^logout/$', logout, 'next_page': '/', name='gauth_logout'),
     url(r'^profile/$', TemplateView.as_view(template_name="profile.html")),
     )

...

     **login.html**

     <p>Use your work email credentials to sign in to this application: 
     <a href="% url 'socialauth_begin' 'google-oauth2' %">Sign In</a>
      </p>

问题是,当我点击登录时,我被重定向到错误:无效客户端页面,其中包含详细信息:

      Request Details
      cookie_policy_enforce=false
      scope=https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile
      response_type=code
      redirect_uri=http://127.0.0.1:8000/complete/google-oauth2/
      state=WZWyJgDRfeW4RneRynqSZ3nSy0Bzs0v6
      client_id=None

https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile&state=WZWyJgDRfeW4RneRynqSZ3nSy0Bzs0v6&redirect_uri=http://127.0.0.1:8000/complete/google-oauth2/&response_type=code&client_id=None

即使我在我的项目中提供了正确的 client_id,页面(从 url 中可以看出)说它还没有提供。如果我手动将其插入 url,我会被重定向到权限页面。

此外,当我接受权限时,我会收到 AuthCanceled at /complete/google-oauth2/ 错误。是不是我的项目没有正确读取 social_auth 设置?

任何帮助将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

我有同样的问题,只是改变

GOOGLE_OAUTH2_CLIENT_ID = '***.apps.googleusercontent.com'
GOOGLE_OAUTH2_CLIENT_SECRET = '****'

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '****.apps.googleusercontent.com'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET ='****'

在 settings.py 文件中

【讨论】:

我对正确的变量也有同样的问题。它在本地工作得很好,但在我的服务器上,它在 api 调用中传递了 client_id=None...

以上是关于Django OAuth2 错误:提供了 client_id 时,invalid_client 和 client_id=None的主要内容,如果未能解决你的问题,请参考以下文章

Django REST Framework - 来自外部提供商的 OAuth2 Consumer API

Heroku Python Django应用程序部署失败:没有名为'oauth2_provider'的模块

Django/tastypie 实现中的 OAuth 2.0 客户端 ID

单元测试 django 内联表单集

OAuth2.0 social_django微博第三方登录

[认证授权] 3.基于OAuth2的认证(译)