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

Android端如何通过带社交登录的Laravel网站登录并获取JWT Token?

刚好我之前做过类似的需求,这个流程其实核心是APP唤起Web端授权,再通过回调把授权信息带回APP,结合你已有的Laravel社交登录和JWT环境,我给你梳理下具体步骤:

整体流程概述

APP点击社交登录按钮 → 唤起系统浏览器/自定义WebView打开Laravel的社交登录链接 → 用户完成第三方平台(Google/Facebook等)授权 → Laravel处理授权信息,生成JWT Token → 跳转到APP的自定义URL Scheme链接并携带Token → APP拦截该链接,获取Token后完成登录流程


1. 改造Laravel端的社交登录回调逻辑

假设你已经用Laravel Socialite实现了Web端的社交登录,现在需要修改回调路由的处理逻辑:当用户在Web端完成授权后,不再跳回网站页面,而是重定向到APP的自定义Scheme链接,同时携带生成好的JWT Token。

代码示例

// routes/web.php
Route::get('/auth/{provider}/callback', [AuthController::class, 'handleSocialCallback']);

// app/Http/Controllers/AuthController.php
public function handleSocialCallback($provider)
{
    // 通过Socialite获取第三方用户信息
    $socialUser = Socialite::driver($provider)->user();

    // 查找或创建本地系统用户
    $localUser = User::firstOrCreate(
        ['email' => $socialUser->getEmail()],
        ['name' => $socialUser->getName(), 'avatar' => $socialUser->getAvatar()]
    );

    // 生成JWT Token(这里用Laravel Sanctum的示例,你可以替换成自己的JWT实现)
    $token = $localUser->createToken('social-login')->plainTextToken;

    // 重定向到APP的自定义Scheme链接,携带Token和授权平台标识
    return redirect()->away("yourapp://auth/callback?token={$token}&provider={$provider}");
}

注意:第三方平台(如Google/Facebook)的开发者后台里,回调URL仍需配置为你网站的回调地址(比如https://your-domain.com/auth/google/callback),这个是给第三方平台跳转用的。


2. Android端配置自定义URL Scheme

要让Web页面能唤起你的APP并传递参数,需要在AndroidManifest.xml中配置Intent Filter,拦截自定义Scheme的链接:

<activity
    android:name=".ui.auth.SocialLoginCallbackActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        
        <!-- 自定义Scheme配置,这里的scheme和host可以根据你的需求修改 -->
        <data
            android:scheme="yourapp"
            android:host="auth"
            android:path="/callback" />
    </intent-filter>
</activity>

然后在SocialLoginCallbackActivity中处理Intent,提取Token并完成登录:

class SocialLoginCallbackActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        intent.data?.let { uri ->
            val token = uri.getQueryParameter("token")
            val provider = uri.getQueryParameter("provider")
            
            token?.let { validToken ->
                // 保存Token到SharedPreferences或本地数据库
                saveAuthToken(validToken)
                // 跳转到主页面,完成登录
                startActivity(Intent(this, MainActivity::class.java))
                finish()
            } ?: run {
                // 处理Token为空的异常情况,比如跳回登录页提示错误
                Toast.makeText(this, "登录失败,请重试", Toast.LENGTH_SHORT).show()
                startActivity(Intent(this, LoginActivity::class.java))
                finish()
            }
        } ?: finish()
    }
    
    private fun saveAuthToken(token: String) {
        val sharedPref = getSharedPreferences("app_auth", MODE_PRIVATE)
        sharedPref.edit().putString("jwt_token", token).apply()
    }
}

3. Android端唤起Web登录页面

用户点击APP内的社交登录按钮时,推荐使用系统浏览器打开Laravel的社交登录链接(部分第三方平台在WebView中会有安全验证问题,比如Google登录会提示“不安全的浏览器”):

// LoginActivity中登录按钮的点击事件
btnGoogleLogin.setOnClickListener {
    val loginUrl = "https://your-domain.com/auth/google"
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(loginUrl))
    startActivity(intent)
}

如果必须使用WebView,需要配置WebView的Settings(开启JavaScript、允许Cookie等),但还是系统浏览器的兼容性更好。


4. 结合Retrofit使用Token

你已经在用Retrofit了,拿到Token后,可以给Retrofit添加拦截器,自动在请求头中携带JWT:

// 创建OkHttpClient并添加Authorization头拦截器
val okHttpClient = OkHttpClient.Builder()
    .addInterceptor { chain ->
        val token = getSharedPreferences("app_auth", MODE_PRIVATE).getString("jwt_token", null)
        val request = chain.request().newBuilder()
            .apply {
                token?.let { addHeader("Authorization", "Bearer $it") }
            }
            .build()
        chain.proceed(request)
    }
    .build()

// 初始化Retrofit实例
val retrofit = Retrofit.Builder()
    .baseUrl("https://your-domain.com/api/")
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build()

5. 关键安全注意事项

  • 全程HTTPS:Laravel网站的所有请求必须使用HTTPS,防止Token在传输过程中被劫持。
  • Token验证:APP拿到Token后,建议调用一次Laravel的API(比如GET /api/verify-token)验证Token的有效性,避免伪造Token。
  • 过期处理:JWT有过期时间,APP要监听请求返回的401状态码,及时引导用户重新登录或刷新Token。
  • 第三方平台配置:在Google/Facebook等开发者后台,确保添加了你的网站域名到授权列表;如果用WebView,部分平台(如Facebook)需要添加APP的签名哈希。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:01:00