在Django项目中使用Allauth时,可能会出现该问题,其中在重定向到GitHub登录之前,provider_login_url会将用户重定向到/accounts/github/login/。
解决这个问题的一个可能的方法是,在您的settings.py中添加适当的应用程序密钥和秘密密钥:
# settings.py
SOCIALACCOUNT_PROVIDERS = {
'github': {
'APP': {
'client_id': 'YOUR_APP_ID',
'secret': 'YOUR_APP_SECRET',
'key': ''
}
}
}
当使用Allauth的provider_login_url时,您可以使用以下方法将它们添加到URL中:
# views.py
from allauth.socialaccount.models import SocialAccount
from allauth.socialaccount.helpers import complete_social_login
from allauth.socialaccount import providers
def login_view(request):
provider_url = providers.registry.by_id('github').get_login_url(request)
# 改变指向,将app_code替换为自己OAuth2授权app的key
provider_url = provider_url.replace('/authorize',f'/authorize?client_id=app_code')
return redirect(provider_url)
def callback_view(request):
code = request.GET.get('code')
provider = 'github'
account_provider = providers.registry.by_id(provider)
provider_url = account_provider.get_access_token_url(request, code)
# 改变指向,将app_code替换为自己OAuth2授权app的key,并添加secret参数
provider_url = provider_url.replace('client_secret=','client_secret=app_secret&').replace('client_id=',f'client_id=app_code&')
resp = urlopen(provider_url)
data = json.load(resp)
login_token = SocialToken(app=account_provider.get_app(request),
token=data['access_token'])
login_account = SocialAccount(user=request.user, provider=provider)
login_account.social_id = account_provider.normalize_username(
data['login'])
login_account.extra_data = data
complete_social_login(request, login_account, login_token