You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用Google授权码如何通过Laravel Socialite换取AccessToken?

解决Laravel Socialite处理Android Google授权码换取AccessToken的问题

嘿,刚好我之前做过类似的Android + Laravel Google登录的场景,给你一步步拆解怎么实现,完美解决你说的授权码换AccessToken的问题!

核心思路

你猜的没错:Android传授权码 → 后端用授权码换Google AccessToken + 用户信息 → 生成JWT返回。但其实Laravel Socialite已经帮你封装好了授权码换Token的步骤,不用手动去调用Google的API,省了很多事!

具体实现步骤

1. 确认Socialite配置正确

首先确保config/services.php里的Google驱动配置完整,重点是用Web应用的客户端ID和密钥(Android客户端ID没有密钥,没法换取Token),还有重定向URI要和Android端请求授权时用的一致:

'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'), // 从Google控制台获取的Web应用ID
    'client_secret' => env('GOOGLE_CLIENT_SECRET'), // Web应用的密钥
    'redirect' => env('GOOGLE_REDIRECT_URI'), // 比如Android端用的com.your.app:/oauth2callback
],

记得在.env文件里填好对应的环境变量。

2. 编写API路由

在routes/api.php里加一个接收授权码的路由:

Route::post('/google/login', [AuthController::class, 'googleLogin']);

3. 控制器处理逻辑

在你的Auth控制器里写处理方法,这里Socialite的stateless()->userFromCode()方法会自动帮你完成授权码换AccessToken+获取用户信息的操作,一步到位:

use Laravel\Socialite\Facades\Socialite;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Str;
use Tymon\JWTAuth\Facades\JWTAuth;

public function googleLogin(Request $request)
{
    // 验证请求参数
    $validated = $request->validate([
        'code' => 'required|string',
    ]);

    try {
        // 关键:用stateless()模式,因为API没有Session
        $googleUser = Socialite::driver('google')
            ->stateless()
            ->userFromCode($validated['code']);

        // 查找或创建本地用户
        $user = User::updateOrCreate(
            ['google_id' => $googleUser->id],
            [
                'name' => $googleUser->name,
                'email' => $googleUser->email,
                'avatar' => $googleUser->avatar,
                'password' => bcrypt(Str::random(16)), // 生成随机密码,因为Google登录不需要密码
            ]
        );

        // 生成JWT令牌
        $token = JWTAuth::fromUser($user);

        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'user' => $user,
        ], 200);
    } catch (\Exception $e) {
        return response()->json([
            'error' => 'Google认证失败:' . $e->getMessage(),
        ], 401);
    }
}

关键细节说明

  • stateless():因为是API接口,没有Session支持,必须调用这个方法告诉Socialite不要依赖Session来处理状态,否则会报错。
  • userFromCode():这个方法内部会自动向Google的Token端点发送请求,用授权码换取AccessToken、RefreshToken,同时拉取用户的基本信息(姓名、邮箱、头像等),完全不用你手动写HTTP请求。
  • Google控制台配置:要确保Web应用的客户端ID已经把你的后端API域名加入到「授权的JavaScript来源」,同时重定向URI要和Android端的一致(比如com.your.app:/oauth2callback)。

验证流程

  1. Android端通过Google Sign-In SDK获取授权码(注意要请求email和profile权限)
  2. 把授权码POST到后端的/api/google/login接口
  3. 后端返回JWT令牌,Android端用这个令牌请求后续的API接口

这样整个流程就跑通啦,完全覆盖你说的从授权码到JWT的全链路!

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:00:24