You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Laravel Socialite在Heroku生产环境失效,请求GitHub接口报404错误

解决Heroku上Laravel Socialite GitHub OAuth 404错误

看起来你遇到的问题是本地环境正常,但部署到Heroku后调用GitHub OAuth的token端点返回404。结合本地正常的情况,大概率是环境配置差异或者OAuth应用设置问题,下面是一步步的排查和解决方法:

1. 优先检查Heroku环境变量配置

本地运行正常说明你的代码逻辑没问题,问题肯定出在生产环境的配置上:

  • 登录Heroku控制台,进入你的应用,查看Settings里的Config Vars,确保GITHUB_CLIENT_IDGITHUB_CLIENT_SECRET和你GitHub OAuth应用里的信息完全一致,没有拼写错误或者遗漏。
  • 同时确认APP_URL设置为你Heroku应用的完整HTTPS域名(比如https://your-app-name.herokuapp.com),Socialite会依赖这个值生成正确的回调URL参数。

2. 验证GitHub OAuth应用的回调URL

GitHub会严格校验回调URL的合法性,生产环境的URL必须提前添加到OAuth应用设置里:

  • 登录GitHub,进入Settings > Developer settings > OAuth Apps,找到你的应用。
  • Authorization callback URL里添加Heroku应用的回调路径(比如https://your-app-name.herokuapp.com/auth/github/callback),路径要和你代码里的路由完全匹配。本地的回调URL可以保留,但必须加上生产环境的地址。

3. 检查Socialite请求的细节(通过日志排查)

可以在Heroku上添加日志,查看Socialite实际发送的请求参数,确认哪里出了问题:

use Illuminate\Support\Facades\Log;

// 在调用getAccessTokenResponse之前添加日志
public function redirectToProvider($service, Request $request) {
    Log::info('GitHub OAuth Request Params', [
        'client_id' => config('services.github.client_id'),
        'code' => $request->code,
        'redirect_uri' => config('services.github.redirect')
    ]);
    
    $driver = Socialite::driver($service);
    // ... 后续代码
}

然后通过heroku logs --tail命令查看实时日志,重点确认redirect_uri是否和GitHub上配置的一致,code参数是否正确传递。

4. 尝试使用Socialite的简化流程

你当前手动调用getAccessTokenResponsegetUserByToken的方式,不如使用Socialite提供的封装方法可靠,建议改成标准流程:

public function handleProviderCallback($service, Request $request) {
    try {
        // 自动完成code换token、获取用户信息的流程
        $githubUser = Socialite::driver($service)->user();
        
        $user = (new User())->exists($githubUser->getEmail());
        $token = JWTAuth::fromUser($user);
        
        return response()->json([
            'access_token' => $token,
            'user' => [
                'data' => $user,
                'token' => $token
            ]], 200);
    } catch (\GuzzleHttp\Exception\ClientException $e) {
        // 捕获异常并打印详细日志,方便排查
        Log::error('GitHub OAuth Error', [
            'message' => $e->getMessage(),
            'response' => $e->getResponse()->getBody()->getContents()
        ]);
        return response()->json(['error' => 'GitHub认证失败'], 500);
    }
}

这个封装方法会自动处理请求头、参数拼接等细节,减少手动出错的可能。

5. 排查HTTPS和中间件问题

GitHub OAuth要求生产环境的回调URL必须是HTTPS,确保你的Heroku应用已经启用了HTTPS(Heroku默认对所有应用提供HTTPS)。另外,检查是否有自定义中间件修改了请求方法或者参数,导致请求被篡改。


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

火山引擎 最新活动