填坑记录:laravel passport与手机短信登录结合

发布时间 - 2021-12-27 00:00:00    点击率:

下面由laravel教程栏目给大家介绍关于laravel passport 与手机短信登录结合的问题,希望对大家有所帮助!

准备步骤

laravel passport 环境

怎么安装 怎么使用 看文档就行 这边就记录下和手机短信的坑 和 如何与 passport 结合

坑一

easy-sms 包 对接腾讯云 请用 1.3 版本 2.0 版本 会一致报错发不出去 我反复测试了好几次 简直是坑死我了 并且 code 如果含有字母 他会提示我的签名有问题 实名 diss 下腾讯云的接口 简直是 无语死了

坑二

判断验证码匹配上,创建一个用户,那么怎么给他 token 呢,百度了一堆方法,什么杂七杂八的都有,什么都试过了 要不只支持 laravel5 点几 要不版本怎么样 要不然怎么样的 简直了

if ($innerVerificationCode==$verificationCode) {
  //验证码成功成功,判断是由在数据库中有此手机用户,有立即给他token 没有 创建后给他token
  $user=User::query()->where('phone_number', $phoneNumber)->first();
 if (!$user) {
  $user = new User();
  $user->name = $phoneNumber;
  $user->phone_number= $phoneNumber;
  $user->login_type=User::USER_LOGIN_TYPE_PHONE;
  $user->password = bcrypt('12345678');
  $user->save();
  }
  return $this->getToken($user, 'id');
}
// 原本一直在纠结如何不用账号密码直接给他 access_token 但是种种原因不是失败了吗 那就 api 请求下
public function getToken($user, $type)
    {
        $http = new \GuzzleHttp\Client();
        $response = $http->post(config('app.url').'/api/fund/oauth/token', [
            'form_params' => [
                'grant_type' => 'password',
                'username' => $user->$type,//用户可以直接登录的用户名,配置后也可以是邮箱,5.8版本,这个默认是注册后的邮箱
                'password' => '12345678',//用户名对应的密码
                'scope' => '*',
            ],
        ]);
        return  json_decode($response->getBody(), false);
    }

access_token 接口的代码如下:

getParsedBody());
        $validator = Validator::make($request->all(), [
            'username' => 'required',
            'password' => 'required',
        ])->validate();
        $checkUser = \App\Models\User::where("id", $request->get("username"))->first();
        if (!Hash::check($request->get("password"), $checkUser->password)) {
            throw new UnauthorizedHttpException('Unauthenticated', "login failed,username error or password error");
        }
        $oauthClient = DB::table('oauth_clients')->where("password_client", 1)->first();
        if (empty($oauthClient)) {
            throw new \ErrorException('can not get oauth client information');
        }
        //获取其他参数
        $addRequest = [
            'grant_type' => $request->get("grant_type", "password"),
            'client_id' => $request->get("client_id", $oauthClient->id),
            'client_secret' => $request->get("client_secret", $oauthClient->secret),
            'scope' => $request->get("scope", "*"),
        ];
        //重写传入参数
        $newRawRequest = $rawRequest->withParsedBody(array_merge($request->all(), $addRequest));
        return parent::issueToken($newRawRequest);
    }
    /**
     * revoke token
     *
     * 吊销令牌
     *
     */
    public function revokeToken()
    {
        if(Auth::user()){
            $tokenId = Auth::user()->token()->id;
            $tokenRepository = app('Laravel\Passport\TokenRepository');
            $tokenRepository->revokeAccessToken($tokenId);
        }
        return response('', 204);
    }
}

给自己记录下 这个文章的文笔不好,随便记录下 现在时间忙

找到了另一种 更好的

getNewRefreshToken();
        $refreshToken->setExpiryDateTime((new \DateTimeImmutable())->add(Passport::refreshTokensExpireIn()));
        $refreshToken->setAccessToken($accessToken);
        while ($maxGenerationAttempts-- > 0) {
            $refreshToken->setIdentifier($this->generateUniqueIdentifier());
            try {
                $refreshTokenRepository->persistNewRefreshToken($refreshToken);
                return $refreshToken;
            } catch (UniqueTokenIdentifierConstraintViolationException $e) {
                if ($maxGenerationAttempts === 0) {
                    throw $e;
                }
            }
        }
    }
    protected function createPassportTokenByUser(User $user, $clientId)
    {
        $accessTokenRepository = new AccessTokenRepository(new TokenRepository(), new Dispatcher());
        $accessToken = $accessTokenRepository->getNewToken(new Client($clientId, null, null), [new Scope("*")], $user->id);
        $accessToken->setIdentifier($this->generateUniqueIdentifier());
        $accessToken->setClient(new Client($clientId, null, null));
        $accessToken->setExpiryDateTime((new \DateTimeImmutable())->add(Passport::tokensExpireIn()));
        $accessTokenRepository->persistNewAccessToken($accessToken);
        $refreshToken = $this->issueRefreshToken($accessToken);
        return [
            'access_token' => $accessToken,
            'refresh_token' => $refreshToken,
        ];
    }
    protected function sendBearerTokenResponse($accessToken, $refreshToken)
    {
        $response = new BearerTokenResponse();
        $response->setAccessToken($accessToken);
        $response->setRefreshToken($refreshToken);
        $privateKey = new CryptKey('file://'.Passport::keyPath('oauth-private.key'),null,false);
        $accessToken->setPrivateKey($privateKey);
        $response->setPrivateKey($privateKey);
        $response->setEncryptionKey(app('encrypter')->getKey());
        return $response->generateHttpResponse(new Response);
    }
    /**
     * @param User $user
     * @param $clientId
     * @param bool $output
     * @return mixed|\Psr\Http\Message\ResponseInterface
     */
    protected function getBearerTokenByUser(User $user, $clientId, $output = true)
    {
        $passportToken = $this->createPassportTokenByUser($user, $clientId);
        $bearerToken = $this->sendBearerTokenResponse($passportToken['access_token'], $passportToken['refresh_token']);
        if (! $output) {
            $bearerToken = json_decode($bearerToken->getBody()->__toString(), true);
        }
        return $bearerToken;
    }
}
  $user=User::find(2);
        $token =  $this->getBearerTokenByUser($user,6,false);
        return $token;
相关推荐:最新的五个Laravel视频教程


# laravel  # 给他  # 令牌  # 腾讯  # 验证码  # 自己的  # 复测  # 都有  # 那就  # 死了  # 是由 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  如何在IIS7中新建站点?详细步骤解析  黑客入侵网站服务器的常见手法有哪些?  如何快速搭建高效香港服务器网站?  Bootstrap整体框架之CSS12栅格系统  Laravel如何使用Collections进行数据处理?(实用方法示例)  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  免费网站制作appp,免费制作app哪个平台好?  简历没回改:利用AI润色让你的文字更专业  Linux后台任务运行方法_nohup与&使用技巧【技巧】  详解Huffman编码算法之Java实现  详解CentOS6.5 安装 MySQL5.1.71的方法  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  装修招标网站设计制作流程,装修招标流程?  如何在万网主机上快速搭建网站?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  微信小程序 闭包写法详细介绍  佛山网站制作系统,佛山企业变更地址网上办理步骤?  深圳网站制作培训,深圳哪些招聘网站比较好?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  大型企业网站制作流程,做网站需要注册公司吗?  android nfc常用标签读取总结  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  JavaScript常见的五种数组去重的方式  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  php json中文编码为null的解决办法  Java类加载基本过程详细介绍  新三国志曹操传主线渭水交兵攻略  微信公众帐号开发教程之图文消息全攻略  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  如何撰写建站申请书?关键要点有哪些?  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Laravel用户密码怎么加密_Laravel Hash门面使用教程  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  5种Android数据存储方式汇总  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  如何在IIS管理器中快速创建并配置网站?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Python高阶函数应用_函数作为参数说明【指导】  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Python文件流缓冲机制_IO性能解析【教程】