在已有Laravel登录系统中添加Microsoft 365登录选项
在已有Laravel登录系统中添加Microsoft 365登录选项
不用新建用户表,只需基于现有users表扩展,以下是完整实现步骤:
1. Azure门户注册应用
- 登录Azure门户,进入「Azure Active Directory」→「应用注册」→「新注册」
- 填写应用名称,选择支持的账户类型(选「任何组织目录中的账户和个人Microsoft账户」适配365和个人账号,或仅选组织账户)
- 设置重定向URI:
https://你的域名/login/microsoft/callback(需和后续Laravel配置一致) - 注册完成后,记录客户端ID、客户端密钥(在「证书和密码」中生成)、租户ID(应用概述页获取,若选任何账户类型可填
common)
2. 安装依赖
使用Laravel Socialite的Microsoft扩展包:
composer require socialiteproviders/microsoft
3. 配置Socialite
3.1 注册事件监听
在app/Providers/EventServiceProvider.php的$listen数组中添加:
protected $listen = [ \SocialiteProviders\Manager\SocialiteWasCalled::class => [ \SocialiteProviders\Microsoft\MicrosoftExtendSocialite::class.'@handle', ], ];
3.2 配置服务参数
在config/services.php末尾添加Microsoft配置:
'microsoft' => [ 'client_id' => env('MICROSOFT_CLIENT_ID'), 'client_secret' => env('MICROSOFT_CLIENT_SECRET'), 'redirect' => env('MICROSOFT_REDIRECT_URI'), 'tenant' => env('MICROSOFT_TENANT_ID'), ],
3.3 配置环境变量
在.env文件中添加:
MICROSOFT_CLIENT_ID=你的Azure客户端ID MICROSOFT_CLIENT_SECRET=你的Azure客户端密钥 MICROSOFT_TENANT_ID=common # 或你的组织租户ID MICROSOFT_REDIRECT_URI=https://你的域名/login/microsoft/callback
4. 扩展现有用户表(可选但推荐)
为了关联Microsoft账号与现有用户,给users表添加microsoft_id字段:
php artisan make:migration add_microsoft_id_to_users_table
打开生成的迁移文件,修改为:
public function up() { Schema::table('users', function (Blueprint $table) { $table->string('microsoft_id')->nullable()->unique(); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('microsoft_id'); }); }
执行迁移:
php artisan migrate
5. 添加路由
在routes/web.php中添加登录跳转和回调路由:
Route::get('/login/microsoft', [App\Http\Controllers\Auth\LoginController::class, 'redirectToMicrosoft'])->name('login.microsoft'); Route::get('/login/microsoft/callback', [App\Http\Controllers\Auth\LoginController::class, 'handleMicrosoftCallback']);
6. 实现登录逻辑
修改app/Http/Controllers/Auth/LoginController.php,添加以下方法:
use Laravel\Socialite\Facades\Socialite; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; use App\Models\User; public function redirectToMicrosoft() { return Socialite::driver('microsoft')->redirect(); } public function handleMicrosoftCallback() { try { $microsoftUser = Socialite::driver('microsoft')->user(); } catch (\Exception $e) { return redirect()->route('login')->with('error', 'Microsoft登录失败,请稍后重试'); } // 按邮箱查找现有用户 $user = User::where('email', $microsoftUser->getEmail())->first(); if (!$user) { // 无对应用户则自动创建(密码生成随机字符串,不影响后续登录) $user = User::create([ 'name' => $microsoftUser->getName(), 'email' => $microsoftUser->getEmail(), 'password' => Hash::make(Str::random(16)), 'microsoft_id' => $microsoftUser->getId(), ]); } else { // 若用户已存在但未关联Microsoft账号,更新关联ID if (!$user->microsoft_id) { $user->update(['microsoft_id' => $microsoftUser->getId()]); } } // 登录用户并跳转至预设页面 Auth::login($user); return redirect()->intended('/dashboard'); }
7. 前端添加登录按钮
在登录页面(如resources/views/auth/login.blade.php)中添加Microsoft登录按钮:
<div class="mt-4"> <a href="{{ route('login.microsoft') }}" class="btn btn-block btn-outline-primary"> 用Microsoft 365账号登录 </a> </div>
这样就完成了新增登录方式的配置,用户既可以用原有账号密码登录,也可以通过Microsoft 365账号快速登录,完全复用现有用户表,无需重构原有登录系统。
内容的提问来源于stack exchange,提问作者Omar Mohamed
相关产品推荐
相关产品推荐

