尝试使用EVE ESI接口时遭遇401未授权错误求助
先把你收到的错误响应整理出来:
HTTP/1.1 401 Unauthorized
Cache-Control: private
Server: Microsoft-IIS/8.5
Request-Context: appId=cid-v1:2ccf88f2-29b9-460a-bc15-7c0b79926f61
Date: Tue, 01 May 2018 00:24:50 GMT
Connection: close
Content-Length: 0
结合你提供的PHP/Curl代码片段,我帮你梳理几个最可能导致这个问题的原因,以及对应的修复方案:
1. 客户端凭证的编码与请求头配置问题
你用base64_encode("{my client ID}:{My Secret Key}")生成认证内容,但要注意两个关键点:
- 替换占位符时,要完全保留客户端ID和密钥的原始格式,不要额外添加引号、空格这类多余字符
- 生成的base64字符串必须放在
Authorization: Basic {编码后的内容}这个请求头里,很多人会忘记配置这个头,直接导致401
2. 请求参数不完整
你的代码里$data数组只写了"grant_type" => "authorization_code",但使用authorization_code模式时,必须传递code参数(也就是用户完成授权后返回的授权码),你代码里的"co..."明显是截断了,大概率是没完整传这个参数,这是401的常见诱因。
3. Curl请求格式不符合要求
EVE ESI的token接口有明确的格式要求:
- 请求方法必须是
POST - Content-Type要设置为
application/x-www-form-urlencoded - 要把参数数组用
http_build_query()转成URL编码的字符串,不能直接传数组(Curl默认传数组会用multipart/form-data格式,不符合接口要求)
给你一个修正后的完整示例代码,你可以直接参考调整:
<?php // 替换成你的实际客户端信息 $clientId = "你的客户端ID"; $secretKey = "你的密钥"; // 用户授权后拿到的code $authCode = "用户授权返回的授权码"; // 生成Basic认证头 $authHeader = base64_encode("$clientId:$secretKey"); // 构建完整请求参数 $data = [ "grant_type" => "authorization_code", "code" => $authCode, // 如果授权时指定了redirect_uri,这里必须和授权时的地址完全一致 // "redirect_uri" => "你的回调地址" ]; // 初始化Curl $ch = curl_init(); // 设置Curl核心选项 curl_setopt($ch, CURLOPT_URL, "https://login.eveonline.com/v2/oauth/token"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Basic $authHeader", "Content-Type: application/x-www-form-urlencoded" ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并获取结果 $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 关闭Curl curl_close($ch); // 输出调试信息 echo "HTTP状态码: $httpCode\n"; echo "响应内容: $response\n"; ?>
额外检查点
- 确认客户端ID和密钥是从EVE开发者后台正确复制的,没有手滑多打/少打字符
- 如果授权流程里指定了
redirect_uri,获取token时必须传递完全一致的地址,否则也会返回401 - 检查你的PHP环境是否开启了Curl的SSL支持(EVE接口都是HTTPS协议,SSL禁用会导致请求失败)
内容的提问来源于stack exchange,提问作者tllewellyn
相关产品推荐
相关产品推荐

