下面给大家介绍关于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=newUser();$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请求下publicfunctiongetToken($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'=>'*',],]);returnjson_decode($response->getBody(),false);}
access_token 接口的代码如下:
<?phpnamespaceApp\\Http\\Controllers\\Api;useIlluminate\\Support\\Facades\\Auth;useIlluminate\\Support\\Facades\\DB;useIlluminate\\Support\\Facades\\Hash;usePsr\\Http\\Message\\ServerRequestInterface;use\\Symfony\\Component\\HttpKernel\\Exception\\UnauthorizedHttpException;useValidator;classAccessTokenControllerextends\\Laravel\\Passport\\Http\\Controllers\\AccessTokenController{/***ShowUserToken**获取用户登录令牌信息**@bodyParamusernamestringrequired用户名Example:admin@localhost.com*@bodyParampasswordstringrequired密码Example:123456*@bodyParamis_registerboolean是否为注册操作Example:true*@bodyParamsubscribeboolean订阅状态Example:true*@bodyParamgrant_typestring授权类型默认passwordNo-example*@bodyParamscopestring授权范围默认*No-example*@responseFileresponses/AccessToken.List.example2.json*/publicfunctionissueToken(ServerRequestInterface$rawRequest){//获取传入参数$request=collect($rawRequest->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)){thrownewUnauthorizedHttpException('Unauthenticated',"loginfailed,usernameerrororpassworderror");}$oauthClient=DB::table('oauth_clients')->where("password_client",1)->first();if(empty($oauthClient)){thrownew\\ErrorException('cannotgetoauthclientinformation');}//获取其他参数$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));returnparent::issueToken($newRawRequest);}/***revoketoken**吊销令牌**/publicfunctionrevokeToken(){if(Auth::user()){$tokenId=Auth::user()->token()->id;$tokenRepository=app('Laravel\\Passport\\TokenRepository');$tokenRepository->revokeAccessToken($tokenId);}returnresponse('',204);}}
给自己记录下 这个文章的文笔不好,随便记录下 现在时间忙
找到了另一种 更好的
<?phpnamespaceApp\\Traits;//这里请引用自己的UserModeluseApp\\Models\\Users\\User;useDateTime;useGuzzleHttp\\Psr7\\Response;useIlluminate\\Events\\Dispatcher;useLaravel\\Passport\\Bridge\\AccessToken;useLaravel\\Passport\\Bridge\\AccessTokenRepository;useLaravel\\Passport\\Bridge\\Client;useLaravel\\Passport\\Bridge\\RefreshTokenRepository;useLaravel\\Passport\\Bridge\\Scope;useLaravel\\Passport\\Passport;useLaravel\\Passport\\TokenRepository;useLeague\\OAuth2\\Server\\CryptKey;useLeague\\OAuth2\\Server\\Entities\\AccessTokenEntityInterface;useLeague\\OAuth2\\Server\\Exception\\OAuthServerException;useLeague\\OAuth2\\Server\\Exception\\UniqueTokenIdentifierConstraintViolationException;useLeague\\OAuth2\\Server\\ResponseTypes\\BearerTokenResponse;/***TraitPassportToken**@packageApp\\Traits*/traitPassportToken{/***Generateanewuniqueidentifier.**@paramint$length**@throwsOAuthServerException**@returnstring*/privatefunctiongenerateUniqueIdentifier($length=40){try{returnbin2hex(random_bytes($length));//@codeCoverageIgnoreStart}catch(\\TypeError$e){throwOAuthServerException::serverError('Anunexpectederrorhasoccurred');}catch(\\Error$e){throwOAuthServerException::serverError('Anunexpectederrorhasoccurred');}catch(\\Exception$e){//Ifyougetthismessage,theCSPRNGfailedhard.throwOAuthServerException::serverError('Couldnotgeneratearandomstring');}//@codeCoverageIgnoreEnd}privatefunctionissueRefreshToken(AccessTokenEntityInterface$accessToken){$maxGenerationAttempts=10;$refreshTokenRepository=app(RefreshTokenRepository::class);$refreshToken=$refreshTokenRepository->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;}}}}protectedfunctioncreatePassportTokenByUser(User$user,$clientId){$accessTokenRepository=newAccessTokenRepository(newTokenRepository(),newDispatcher());$accessToken=$accessTokenRepository->getNewToken(newClient($clientId,null,null),[newScope("*")],$user->id);$accessToken->setIdentifier($this->generateUniqueIdentifier());$accessToken->setClient(newClient($clientId,null,null));$accessToken->setExpiryDateTime((new\\DateTimeImmutable())->add(Passport::tokensExpireIn()));$accessTokenRepository->persistNewAccessToken($accessToken);$refreshToken=$this->issueRefreshToken($accessToken);return['access_token'=>$accessToken,'refresh_token'=>$refreshToken,];}protectedfunctionsendBearerTokenResponse($accessToken,$refreshToken){$response=newBearerTokenResponse();$response->setAccessToken($accessToken);$response->setRefreshToken($refreshToken);$privateKey=newCryptKey('file://'.Passport::keyPath('oauth-private.key'),null,false);$accessToken->setPrivateKey($privateKey);$response->setPrivateKey($privateKey);$response->setEncryptionKey(app('encrypter')->getKey());return$response->generateHttpResponse(newResponse);}/***@paramUser$user*@param$clientId*@parambool$output*@returnmixed|\\Psr\\Http\\Message\\ResponseInterface*/protectedfunctiongetBearerTokenByUser(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;
产品猿社区致力收录更多优质的商业产品,给服务商以及软件采购客户提供更多优质的软件产品,帮助开发者变现来实现多方共赢;
日常运营的过程中我们难免会遇到各种版权纠纷等问题,如果您在社区内发现有您的产品未经您授权而被用户提供下载或使用,您可按照我们投诉流程处理,点我投诉;
本文来自用户发布投稿,不代表产品猿立场 ;若对此文有疑问或内容有严重错误,可联系平台客服反馈;
部分产品是用户投稿,可能本文没有提供官方下下载地址或教程,若您看到的内容没有下载入口,您可以在我们产品园商城搜索看开发者是否有发布商品;若您是开发者,也诚邀您入驻商城平台发布的产品,地址:点我进入;
如若转载,请注明出处:https://www.chanpinyuan.cn/39337.html;