Android应用Google授权码如何通过Laravel Socialite换取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)。
验证流程
- Android端通过Google Sign-In SDK获取授权码(注意要请求
email和profile权限) - 把授权码POST到后端的
/api/google/login接口 - 后端返回JWT令牌,Android端用这个令牌请求后续的API接口
这样整个流程就跑通啦,完全覆盖你说的从授权码到JWT的全链路!
内容的提问来源于stack exchange,提问作者Ashraf Hefny
相关产品推荐
相关产品推荐

