Laravel 5.5电报验证

时间:2017-10-03 15:06:53

标签: php authentication laravel-5.5 php-telegram-bot

我需要通过电报进行授权。 程序如下:

  1. 生成随机字符串
  2. 将其写入缓存
  3. 我们通过命令/ start random_str
  4. 将此行传递给bot
  5. 机器人向服务器发送请求,系统将比较传输的字符串的值并从机器人收到
  6. 如果一切正常,我们会授权/注册用户
  7. 授权时一切都崩溃了。毕竟,授权存储在会话中,并且机器人的会话总是不同的,并且与从站点发送请求的用户的会话不一致。但我已经看过这样的授权,例如https://storebot.me/

    AuthController(网站)

    public function getLogin()
    {
        cache(['auth_key' => str_random(24)], 10);
        return view('panel.auth.login');
    }
    

    AuthController(Bot)

    public function auth(Request $request): JsonResponse
    {
        if (!isset($request->auth_key) || $request->auth_key !== cache('auth_key')) {
            return response()->json([
                'status' => false,
                'message' => 'invalid_token',
            ]);
        }
    
        if (!auth()->check()) {
            if (!$user = User::where('username', $request->user['username'])->first()) {
                DB::beginTransaction();
                try {
                    $user = new User();
                    $user->chat_id = $request->chat_id;
                    $user->username = $request->user['username'];
                    $user->first_name = $request->user['first_name'];
                    $user->last_name = $request->user['last_name'];
                    $user->save();
                    DB::commit();
                } catch (\Exception $e) {
                    DB::rollBack();
                    return response()->json([
                        'status' => false,
                        'message' => $e->getMessage()
                    ]);
                }
            }
    
            auth()->login($user);
        }
    
        return response()->json([
            'status' => true,
            'message' => 'Вы успешно авторизированы.',
        ]);
    }
    

    login.blade.php

    <a href="https://t.me/surgead_bot?start={{ cache('auth_key') }}" target="_blank">Открыть <i class="fa fa-telegram"></i> и нажать Start</a>
    

    bot.js(僵尸程序的长轮询脚本)

    bot.onText(/\/start (.+)/, (msg, params) => {
    axios.post('auth', {
        auth_key: params[1],
        chat_id: msg.chat.id,
        user: msg.from
    })
        .then(response => {
            console.log(response.data);
            if (response.data.status === false) {
                // log or smth??
            }
    
            bot.sendMessage(msg.from.id, response.data.message);
        })
        .catch(error => {
            console.log(error);
        });
    

    });

    所以,我将Laravel 5作为后端。 Bot在JS上工作。我认为问题在于会话。因为,当我将auth_key发送到bot时,它会向服务器发送请求,并且auth会话不适用于用户会话,仅适用于bot。但我不知道如何在需要的会话中进行身份验证。 我尝试使用用户的会话ID创建新会话,但Laravel不允许这样做。

1 个答案:

答案 0 :(得分:0)

我是通过在laravel端使用Autologin来实现的,它通过存储在MySQL中的令牌登录,并在电报机器人生成令牌并链接到laravel路径

https://t.me/intermarkbot