You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

django-allauth集成Steam登录时assoc_type参数缺失引发异常的问题求助

django-allauth集成Steam登录时assoc_type参数缺失引发异常的问题求助

看起来你遇到的是Steam OpenID实现不完全兼容标准导致的异常——虽然登录功能能正常工作,但底层的python-openid库会因为Steam响应里缺失assoc_type参数而抛出KeyError。下面给你几个可行的解决思路:

1. 优先升级django-allauth到最新版本

社区可能已经针对Steam的这个兼容问题发布了修复。执行以下命令升级:

pip install --upgrade django-allauth

升级后重启服务,看看异常是否消失。

2. 配置Steam provider使用无状态OpenID模式

Steam的OpenID支持无状态模式(不需要建立关联),我们可以通过添加额外参数强制使用这个模式,这样就不会触发请求assoc_type的逻辑。修改你的SOCIALACCOUNT_PROVIDERS配置:

SOCIALACCOUNT_PROVIDERS = {
    "steam": {
        "APP": {
            "client_id": STEAM_SECRET_KEY,
            "secret": STEAM_SECRET_KEY,
        },
        "OPENID_AUTH_EXTRA_PARAMS": {
            "assoc_type": "none",
        },
    },
}

这个参数会告诉OpenID客户端使用无状态关联,避免去Steam请求关联信息,自然也就不会因为缺失assoc_type而报错。

3. 自定义Steam Provider覆盖关联逻辑

如果上面的方法无效,可以自定义Steam的Provider类,修改OpenID请求的处理逻辑,强制添加assoc_type参数:

  1. 在你的Django应用中创建一个providers/steam.py文件,内容如下:
from allauth.socialaccount.providers.steam.provider import SteamProvider
from allauth.socialaccount.providers.openid.views import OpenIDLoginView

class CustomSteamProvider(SteamProvider):
    def get_login_view(self):
        return CustomOpenIDLoginView.as_view()

class CustomOpenIDLoginView(OpenIDLoginView):
    def get_openid_request(self):
        openid_request = super().get_openid_request()
        # 强制添加assoc_type参数为无状态模式
        openid_request.addArg(
            "http://specs.openid.net/auth/2.0",
            "assoc_type",
            "none"
        )
        return openid_request
  1. 修改settings.py中的配置,替换默认的Steam Provider:
INSTALLED_APPS = [
    ...
    # 移除原来的 "allauth.socialaccount.providers.steam"
    "your_app_name.providers.steam",  # 替换成你的应用名
    ...
]

SOCIALACCOUNT_PROVIDERS = {
    "steam": {
        "APP": {
            "client_id": STEAM_SECRET_KEY,
            "secret": STEAM_SECRET_KEY,
        },
        "PROVIDER_CLASS": "your_app_name.providers.steam.CustomSteamProvider",
    },
}

补充说明

你的现有配置本身没有明显错误,Steam的OpenID确实不需要严格的client_id(这里用API key是用来获取用户资料的),问题核心是Steam没有遵循OpenID 2.0的完整规范,没有返回assoc_type参数,而底层库对此做了严格校验。

备注:内容来源于stack exchange,提问作者negstek

火山引擎 最新活动