ラボ > 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());
    }
}

参考サイト

【Laravel】既存テーブルで認証&認証方法を差し替えるTips