【问题标题】:How to authenticate user without a DB in Laravel?如何在 Laravel 中验证没有数据库的用户?
【发布时间】:2020-02-28 06:34:57
【问题描述】:

我在 Laravel 中创建了一个新项目,它使用来自 API 的所有数据。对于像用户个人资料这样的私人数据,我需要一个访问令牌来获取数据。

获得访问令牌后,如何在 Laravel 中将令牌设置为 Auth::id()?或者我可以将用户配置文件存储为Auth::user(),以便我可以在前端刀片文件中使用@auth

class CustomAuthController extends Controller
{
    public function index()
    {
        return view('login');
    }

    public function store(Request $request)
    {
        $request->validate([
            'phone' => 'required|numeric'
        ]);

        $data = [
            'phone' => $request->phone
        ];
        $codeSent = GeneralFunction::WebRequestPublicApi('first-login', $data, null, null, null, true);
        if($codeSent->status == "success")
        {
            return redirect('verify');
        } else {
            $errors = new MessageBag();
            $errors->add("phone", "Invalid phone number");
            return view('login')->withErrors($errors);
        }
    }

    public function showVerify()
    {
        return view('verify');
    }

    public function verify(Request $request)
    {
       try {
            $request->validate([
                'verify' => 'required|size:6'
            ]);
            $data = [
                'token_code' => $request->verify,
                'source' => 'web'
            ];
            $token = GeneralFunction::WebRequestPublicApi('verify-login', $data, null, null, null, true);
            if($token->status === "success")
            {
                $userData  = GeneralFunction::WebRequestPublicApi('membership', null, 'GET', null, null, true,  $token->results->access_token);

                if($userData->status !== "error")
                {
                    $user = (array) $userData->results[0];
                    $request->session()->put('token', $token->results->access_token);
                    Auth::attempt($user, false, false);

                    return redirect('/');
                }
            } else {
                $errors = new MessageBag();
                $errors->add("verify", "Invalid Token");
                return view('verify')->withErrors($errors);
            }
       } catch (Exception $e) {
            $errors = new MessageBag();
            $errors->add("verify", $e->getMessage());
            return view('verify')->withErrors($errors);
       }
    }
}

我尝试使用Auth::attempt, Auth::login(), 和其他方法,但所有这些都需要一个用户表。我的项目没有数据库。

【问题讨论】:

  • API 服务中存储的数据。就像我说的所有数据都从 API 消耗
  • 您可以使用您赢得的会话方法。在您的情况下不依赖 laravel 的 Auth 可能会解决您的问题。
  • @Mahbubul 是的,我可以使用会话。但是如果使用会话我不能在前端使用@authAuth::user()
  • 使用会话变量显示 Auth::user() 相关数据。
  • 你的意思是像$session->get('user')吗?但是用这种方法我不能在刀片中使用@auth

标签: php laravel laravel-blade laravel-6 laravel-authentication


【解决方案1】:

您可以执行以下操作。

在控制器中

if($auth_ok)
{
    session(['user' => ['key' => 'value', 'key2' => 'value2'] ]); // set session data
    return view('frontend');
}

在视图中

$user = session('user', false);

@if(!$user) // if not logged in

do something

@else // logged in successfully

Welcome my user

@endif

希望这会有所帮助。

【讨论】:

  • 是的,它对 mahbubul 有帮助。但我还在问?是使用 laravel 提供的官方自定义 Auth 的另一种方式,所以我可以在前端使用 @auth。但是感谢您的帮助马布布尔
  • 没有数据库我认为这是简单的方法。否则,您将需要更冗长和定制的解决方案。
  • 您可以使用自定义防护或中间件方法。你可以查看 Laravel 文档。
  • 最后我使用了你的建议 Mahbubul,因为我想有很多时间来研究.. 非常感谢你 Mahbubul
  • 我正在尝试实现同样的目标 - 您最终是设置会话数据还是创建自定义身份验证保护?
【解决方案2】:

我想你需要做的最好的事情是使用 sqlite,一旦你从你的 api 登录,就可以从中创建一个新用户或查找是否已经存在Auth::login($newUser);

【讨论】:

    猜你喜欢
    • 2018-11-09
    • 2016-10-08
    • 2019-09-12
    • 2014-11-08
    • 2017-07-17
    • 1970-01-01
    • 2018-10-26
    • 2017-04-27
    • 1970-01-01
    相关资源
    最近更新 更多