Laravel中Discord OAuth2登录报错问题求助
Laravel中Discord OAuth2登录报错问题求助
哥们我之前也踩过Discord OAuth的坑,看了你的代码后,发现几个大概率导致报错的点,咱们一个个来排查:
- Scope参数拼写错误:你写的
'scope' => 'identify%20guids'里的guids是错的,Discord的服务器权限应该是guilds,而且完全不用手动做URL编码,直接写'identify guilds'就行,Laravel的Http客户端会自动帮你处理编码逻辑。 - 转义箭头语法错误:你的代码里用了
=>这种HTML转义字符,在PHP里定义数组应该直接用=>,比如'grant_type' => 'authorization_code'要改成'grant_type' => 'authorization_code',所有数组的箭头都要修正,不然会直接导致语法错误或者数组定义失败。 - Redirect URI一致性问题:你代码里的
redirectUri是http://127.0.0.1:8000/discord-auth,一定要确保和你在Discord开发者后台创建的应用里设置的重定向URI完全一致——包括协议(http/https)、域名、端口和路径,哪怕差一个斜杠都会报错。 - Code参数有效性问题:要确认
$code是用户授权后Discord跳转到回调页面时传递的code参数,比如在回调控制器里应该用$code = request('code');来获取。如果$code是空的或者已经过期(Discord的code只有5分钟有效期),也会直接返回错误。 - Http请求头部冗余设置:Laravel的
Http::post方法如果传递数组作为请求体,会自动把Content-Type设置为application/x-www-form-urlencoded,所以你手动设置这个头部其实没必要,甚至可能因为重复设置出问题,可以直接去掉这个withHeaders部分。
下面是修正后的代码示例:
$clientSecret = 'myclientsecret'; $clientId = 'myclientid'; $redirectUri = 'http://127.0.0.1:8000/discord-auth'; $tokenUrl = 'https://discord.com/api/oauth2/token'; // 先确保获取到正确的授权code $code = request('code'); if (!$code) { return redirect()->route('login')->with('error', '缺少授权code'); } $data = [ 'grant_type' => 'authorization_code', 'client_id' => $clientId, 'client_secret' => $clientSecret, 'redirect_uri' => $redirectUri, 'code' => $code, 'scope' => 'identify guilds', // 修正拼写并去掉手动编码 ]; // 本地非HTTPS环境才需要withoutVerifying,正式环境建议去掉 $res = Http::withoutVerifying()->post($tokenUrl, $data); // 可以打印详细错误信息定位问题 if ($res->failed()) { dd($res->body(), $res->status()); } dd($res);
备注:内容来源于stack exchange,提问作者Praveen
相关产品推荐
相关产品推荐

