whyounes/laravel-passwordless-auth

Laravel 的无密码认证

v1.1 2016-11-24 18:51 UTC

This package is auto-updated.

Last update: 2024-08-29 04:25:30 UTC


README

Laravel 5 的无密码认证

Build status

安装

使用 Composer 将包添加到您的项目中

composer require whyounes/laravel-passwordless-auth

发布包资源

php artisan vandor:publish

运行迁移以创建令牌表

php artisan migrate

将其添加到您的提供者列表中

// config/app.php

// ...
'providers' => [
    // ...
    Whyounes\Passwordless\Providers\PasswordlessProvider::class,
};

Passwordless 特性添加到您的用户模型中

// app/User.php

class User extends Authenticatable
{
    use Whyounes\Passwordless\Traits\Passwordless;

    // ...
}

配置

如果您不想使用用户电子邮件与令牌一起使用,您可以覆盖以下方法来更改它

// app/User.php

class User extends Authenticatable
{
    use Whyounes\Passwordless\Traits\Passwordless;

    // ...
    
    protected function getIdentifierKey()
    {
        return 'email';
    }
}

您可以在 config/passwordless.php 文件中更改过期时间

// config/passwordless.php

return [
    'expire_in' => 15, // Minutes
    'empty_tokens_after_login' => true // Empty user tokens after login
];

如果您不想从数据库中删除未使用的令牌,可以将 empty_tokens_after_login 配置设置为 false。

示例

显示登录表单让用户输入电子邮件

// routes/web.php

Route::post('/login/direct', function() {
    return view('login.direct');
});

捕获表单提交

// routes/web.php

Route::post('/login/direct', function(Request $request) {
    // send link to user mail
    $user = App\User::where('email', $request->get('email'))->first();
    if (!$user) {
        return redirect()->back(404)->with('error', 'User not found');
    }

    // generate token and save it
    $token = $user->generateToken(true);

    // send email to user
    \Mail::send("mails.login", ['token' => $token], function($message) use($token) {
        $message->to($token->user->email);
    });
});

捕获登录链接请求

// routes/web.php

Route::get('/login/{token}', function(Request $request, $token) {
    $user = App\User::where('email', $request->get('email'))->first();

    if (!$user) {
        dd('User not found');
    }

    if($user->isValidToken($token))
    {
        // Login user
        Auth::login($user);
    } else {
        dd("Invalid token");
    }
});

或者,如果您喜欢处理异常

// routes/web.php

Route::get('/login/{token}', function(Request $request, $token) {
    try {
        $user = App\User::where('email', $request->get('email'))->firstOrFail();
        $user->validateToken($token);

        Auth::login($user);
    } catch(Illuminate\Database\Eloquent\ModelNotFoundException $ex) {
        dd('User not found');
    } catch(Whyounes\Passwordless\Exceptions\InvalidTokenException $ex) {
        dd("Invalid token");
    }
});