使用Guardian进行API认证测试时遭遇未授权错误求助
排查Guardian「Unauthenticated」测试错误的常见思路
我之前在测试Phoenix控制器的Guardian认证时,也踩过不少类似的坑,结合你给出的代码片段,先给你梳理几个最可能的问题点:
1. Authorization Header格式错误
这是最容易踩的低级坑!你当前代码里的header写法是:
put_req_header("authorization", "bearer: " <> jwt)
但标准的Bearer认证格式是**Bearer (空格分隔,没有冒号)**,Guardian的VerifyHeader插件默认只会识别这个标准格式。赶紧改成这样试试:
put_req_header("authorization", "Bearer " <> jwt)
2. 控制器管道未配置关键Guardian插件
要确保你的控制器已经接入了Guardian的认证流程,比如在router.ex或者控制器本身的插件配置里,必须包含这几个核心步骤:
# 示例:在控制器内配置 plug Guardian.Plug.VerifyHeader, scheme: "Bearer" plug Guardian.Plug.LoadResource, allow_blank: false
如果漏掉这些插件,请求进来时Guardian不会去解析token、加载关联用户,自然会直接返回Unauthenticated。
3. 测试用例未正确接收setup传递的conn
你的测试代码片段写的是%{conn: ...,要确保完整的测试用例正确解构了setup生成的带认证头的conn:
test "creates and renders resource when data is valid", %{conn: conn} do # 比如发送创建资源的POST请求 conn = post(conn, Routes.your_resource_path(conn, :create), your_params) # 断言响应状态和内容 assert json_response(conn, 201)["data"] end
如果conn没有正确传递,测试里用的还是未加认证头的原始conn,肯定会触发认证失败。
4. 用户工厂函数的潜在问题
检查insert(:user)生成的用户是否包含Guardian需要的唯一标识字段(默认是:id)。如果你的工厂函数没有正确生成:id,或者Guardian配置里指定的其他标识字段缺失,encode_and_sign生成的token会无效,最终导致认证失败。
如果上面这些都排查过还是没解决,可以把完整的控制器代码、Guardian配置以及测试用例的完整逻辑贴出来,咱们再进一步定位问题~
内容的提问来源于stack exchange,提问作者Bitwise
相关产品推荐
相关产品推荐

