ラボ > Laravel、Lumen:ユーザー認証関連
Laravel 既存テーブルで認証(Auth、ログイン機能)を作る
ユーザーテーブルが別途指定されていたり、諸々の事情である程度、自前でログイン機能を作る必要があるとき。
作成日:2019-10-03, 更新日:2022-12-22
基本
個人的にLaravelは嫌い。
コンソールで「artisan」のコマンドを叩いて、コトあるごとに「composer」のコマンドを叩く必要があるため。
特に「artisan」のコマンドを叩くとドコに何のファイルが増えて、どのファイルが書き換えられて・・・ってのが分からない。
時間をかけて調べれば分かるんだろうけど、そこまで時間をかけるコトができない。
▼対象者
・ひとまずログイン機能を実装しなくちゃいけない
・ログイン機能でカスタマイズが必要(or 超シンプルにしたい、余計なコトはしないで欲しい)
※「artisan」のコマンドを叩いた結果を元にカスタマイズが可能な人は対象外。
▼触るとこ
・\App\User.php
・コントローラーとか
\App\User.php
// テーブル名
protected $table = '〇〇〇〇';
// プライマリーキー(指定なしだと「id」)
protected $primaryKey = '〇〇〇〇';
// デフォルトでは自動インクリメントが true
public $incrementing = false;
// テーブルに組み込むカラム名たち
protected $fillable = [
'〇〇〇〇', 'password', 'remember_token',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
];
// パスワードのカラム名
public function getAuthPassword() {
return $this->password;
}
こんな感じ。
テーブルには「created_at」「updated_at」が必須っぽい。
コントローラーとか
・「use」は出来る限り使わないようにする方針(※ソースを追いかけやすくするため)
ユーザー作成:パスワードは手動でハッシュ化
$userData = array(
'member_id' => '123458',
'password' => bcrypt('abcd'),
'password_date' => date('Y-m-d H:i:s'),
);
$result = \App\User::create($userData);
ユーザーログイン
$username = '123458'; $password = 'abcd'; $remember = true; // クッキーを使用して、ログインし続ける $result = \Auth::attempt(['member_id'=>$username, 'password'=>$password], $remember);
※$resultは「true / false」
ログアウト
\Auth::logout();
ログインチェック
if ( \Auth::check() ) {
if (\Auth::viaRemember()) {
echo '「remember me」クッキーを使用して認証中';
}
else {
echo '「remember me」クッキーを使用せずに認証中';
}
}
else {
echo 'ログアウト中';
}
ユーザー情報取得
$result = \Auth::user();
※ログインしていない場合は$resultには「NULL」
パスワードが等しいかチェック
$pwd_Hash = DBに保存しているハッシュ化されたパスワード
$pwd_input = 平文のパスワード
if ( \Hash::check($pwd_input, $pwd_Hash) ) {
echo '正しいパスワードです';
}
else {
echo '間違ったパスワードです';
}
メモ
呼び出されている大元たち
・vendor\laravel\framework\src\Illuminate\Auth
・vendor\laravel\framework\src\Illuminate\Foundation\Auth
artisanで作られるファイル?
色々と調べていたら・・・下記のようなファイルが作られるっぽい。
ログイン回りの処理があるのでコレを参考にすればよさげ。
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
class AuthController extends Controller
{
public function login(Request $request) {
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string',
//'remember_me' => 'boolean'
]);
$credentials = request(['email', 'password']);
if(!Auth::attempt($credentials))
return response()->json([
'message' => 'Unauthorized'
], 401);
$user = $request->user();
$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;
if ($request->remember_me)
$token->expires_at = Carbon::now()->addWeeks(1);
$token->save();
return response()->json([
'access_token' => $tokenResult->accessToken,
'token_type' => 'Bearer',
'expires_at' => Carbon::parse(
$tokenResult->token->expires_at
)->toDateTimeString()
]);
}
public function register(Request $request)
{
$request->validate([
'fName' => 'required|string',
'lName' => 'required|string',
'email' => 'required|string|email|unique:users',
'password' => 'required|string'
]);
$user = new User;
$user->first_name = $request->fName;
$user->last_name = $request->lName;
$user->email = $request->email;
$user->password = bcrypt($request->password);
$user->save();
return response()->json([
'message' => 'Successfully created user!'
], 201);
}
public function logout(Request $request)
{
$request->user()->token()->revoke();
return response()->json([
'message' => 'Successfully logged out'
]);
}
/**
* Get the authenticated User
*
* @return [json] user object
*/
public function user(Request $request)
{
return response()->json($request->user());
}
}