You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移Flask-OAuthlib到Authlib时/token端点返回unsupported_grant_type错误

解决Authlib迁移后/token端点返回unsupported_grant_type的问题

针对你从Flask-OAuthlib迁移到Authlib后,调用/token端点收到{"error": "unsupported_grant_type"}的错误,结合你的代码实现,以下是关键修复点:

1. 未将自定义授权码Grant注册到OAuth2服务器

Authlib的OAuth2Server需要显式注册你实现的授权类型Grant类,否则服务器无法识别authorization_code授权类型。

修复代码:
在初始化OAuth2Server的位置添加注册逻辑:

from authlib.integrations.flask_oauth2 import AuthorizationServer

# 假设你已实现查询客户端和保存Token的方法
server = AuthorizationServer(
    app,
    query_client=your_query_client_func,
    save_token=your_save_token_func
)

# 注册自定义的授权码Grant类
server.register_grant(AuthorizationCodeGrant)

2. authenticate_user方法未正确实现

你的authenticate_user仅打印日志,未返回用户对象。Authlib需要该方法返回用户实例来完成授权码流程的用户认证,缺失此逻辑会导致授权类型校验失败。

修复代码:

def authenticate_user(self, authorization_code):
    LOGGER_PREFIX = 'AUTHENTICATE_USER'
    logger.debug(f'{LOGGER_PREFIX}: authorization_code == {str(authorization_code)}')
    # 从MongoDB中根据授权码关联的用户ID查询用户
    return mongo.db.users.find_one({"user_id": authorization_code.user["user_id"]})

3. delete_authorization_code方法未实现

根据OAuth2规范,授权码使用后必须删除,否则会导致重复使用问题,也可能影响流程正常执行。

修复代码:

def delete_authorization_code(self, authorization_code):
    LOGGER_PREFIX = 'DELETE_AUTHORIZATION_CODE'
    logger.debug(f'{LOGGER_PREFIX}: authorization_code == {str(authorization_code)}')
    # 删除MongoDB中对应的授权码记录
    mongo.db.oauth_grant.delete_one({
        "client_id": authorization_code.client_id,
        "code": authorization_code.code
    })

4. 检查/token请求的参数规范

确保请求/token端点时满足以下要求:

  • 使用POST方法
  • 请求内容类型为application/x-www-form-urlencoded(表单格式)
  • 必须携带参数:grant_type=authorization_code、code=授权码、client_id=客户端ID,若授权时指定了回调地址还需携带redirect_uri

5. 确认Token模型的保存逻辑

确保你实现了save_token函数并在初始化AuthorizationServer时传入,该函数负责将生成的Token存储到MongoDB:

def save_token(token, request):
    # 构造Token文档并保存
    token_doc = Token(
        client_id=request.client.client_id,
        user_id=request.user["user_id"],
        **token
    )
    mongo.db.oauth_token.insert_one(class_to_json(token_doc))

完成以上修复后,重启服务并测试/token端点,即可解决unsupported_grant_type错误。

内容的提问来源于stack exchange,提问作者Alexander P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:35:00