LinkedIn登录获取Access Token失败:参数不匹配或授权码过期
看到你碰到的这个错误,结合错误信息和点击后2秒就报错的情况,我帮你拆解下核心问题点,咱们一步步排查:
Redirect URI必须完全匹配
这是OAuth场景里最容易踩的坑!服务端对redirect_uri的校验极其严格,你在http://localhost/index.php发起授权请求时传递的redirect_uri,必须和回调页面请求token时用的地址完全一致——包括大小写、末尾的斜杠、HTTP/HTTPS协议,哪怕差一个字符都不行。比如授权时传的是http://localhost/callback.php,回调就不能写成http://localhost/callback。确认授权码的有效性
错误里提到授权码可能过期,但2秒就报错显然不是正常过期(一般授权码有效期至少几分钟),更可能是这两种情况:- 授权码被重复使用:OAuth授权码是一次性的,用过一次就失效,如果你之前测试过一次没成功,再用同一个code请求token肯定会报错,得重新走授权流程生成新的code。
- AppID不匹配:生成授权码时用的AppID,和请求token时用的AppID必须是同一个,别搞混了测试环境和正式环境的应用ID。
检查Token请求的参数完整性
错误提示里的"missing required parameters"说明可能漏传了必填参数,你得确保token请求里包含所有必要字段:
通常需要grant_type=authorization_code、code=拿到的授权码、client_id=你的AppID、client_secret=你的AppSecret、redirect_uri=回调地址这几个参数,同时要避免重复传递同一个参数(比如不小心传了两次code)。快速验证授权码有效性
你可以先在回调页面把拿到的code打印出来,确认是正常的字符串,再带着这个code去请求token,排除code本身获取异常的问题。
给你贴个简化的PHP回调页面示例,参考下参数传递的正确姿势:
<?php // 先拿到授权码 $code = $_GET['code'] ?? ''; if (empty($code)) { die('未获取到授权码'); } // 配置参数(注意要和授权时完全一致) $client_id = '你的应用ID'; $client_secret = '你的应用密钥'; $redirect_uri = 'http://localhost/你的回调页面.php'; $token_api = '授权服务的token接口地址'; // 构造POST请求参数 $post_data = http_build_query([ 'grant_type' => 'authorization_code', 'code' => $code, 'client_id' => $client_id, 'client_secret' => $client_secret, 'redirect_uri' => $redirect_uri ]); // 发起请求 $context = stream_context_create([ 'http' => [ 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => $post_data ] ]); $response = file_get_contents($token_api, false, $context); var_dump($response); ?>
如果排查完上面几点还是不行,你可以把授权请求的URL和token请求的参数(敏感信息打码)补充出来,方便进一步定位问题。
内容的提问来源于stack exchange,提问作者strangeQuirks

