填坑記錄:laravel passport與手機短信登錄結合

下面由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?GuzzleHttpClient(); ????????$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 接口的代碼如下:

<?php namespace AppHttpControllersApi; use IlluminateSupportFacadesAuth; use IlluminateSupportFacadesDB; use IlluminateSupportFacadesHash; use PsrHttpMessageServerRequestInterface; use SymfonyComponentHttpKernelExceptionUnauthorizedHttpException; use Validator; class AccessTokenController extends LaravelPassportHttpControllersAccessTokenController {     /**      * Show User Token      *      * 獲取用戶登錄令牌信息      *      * @bodyParam username string required 用戶名 Example: admin@localhost.com      * @bodyParam password string required 密碼 Example: 123456      * @bodyParam is_register boolean  是否為注冊操作 Example: true      * @bodyParam subscribe boolean  訂閱狀態 Example: true      * @bodyParam grant_type string 授權類型默認password No-example      * @bodyParam scope string 授權范圍默認* No-example      * @responseFile responses/AccessToken.List.example2.json      */     public function issueToken(ServerRequestInterface $rawRequest)     {         //獲取傳入參數         $request = collect($rawRequest->getParsedBody()); ????????$validator?=?Validator::make($request-&gt;all(),?[ ????????????'username'?=&gt;?'required', ????????????'password'?=&gt;?'required', ????????])-&gt;validate(); ????????$checkUser?=?AppModelsUser::where("id",?$request-&gt;get("username"))-&gt;first(); ????????if?(!Hash::check($request-&gt;get("password"),?$checkUser-&gt;password))?{ ????????????throw?new?UnauthorizedHttpException('Unauthenticated',?"login?failed,username?error?or?password?error"); ????????} ????????$oauthClient?=?DB::table('oauth_clients')-&gt;where("password_client",?1)-&gt;first(); ????????if?(empty($oauthClient))?{ ????????????throw?new?ErrorException('can?not?get?oauth?client?information'); ????????} ????????//獲取其他參數 ????????$addRequest?=?[ ????????????'grant_type'?=&gt;?$request-&gt;get("grant_type",?"password"), ????????????'client_id'?=&gt;?$request-&gt;get("client_id",?$oauthClient-&gt;id), ????????????'client_secret'?=&gt;?$request-&gt;get("client_secret",?$oauthClient-&gt;secret), ????????????'scope'?=&gt;?$request-&gt;get("scope",?"*"), ????????]; ????????//重寫傳入參數 ????????$newRawRequest?=?$rawRequest-&gt;withParsedBody(array_merge($request-&gt;all(),?$addRequest)); ????????return?parent::issueToken($newRawRequest); ????} ????/** ?????*?revoke?token ?????* ?????*?吊銷令牌 ?????* ?????*/ ????public?function?revokeToken() ????{ ????????if(Auth::user()){ ????????????$tokenId?=?Auth::user()-&gt;token()-&gt;id; ????????????$tokenRepository?=?app('LaravelPassportTokenRepository'); ????????????$tokenRepository-&gt;revokeAccessToken($tokenId); ????????} ????????return?response('',?204); ????} }

給自己記錄下 這個文章的文筆不好,隨便記錄下 現在時間忙

找到了另一種 更好的

<?php namespace AppTraits; //這里請引用自己的User Model use AppModelsUsersUser; use DateTime; use GuzzleHttpPsr7Response; use IlluminateEventsDispatcher; use LaravelPassportBridgeAccessToken; use LaravelPassportBridgeAccessTokenRepository; use LaravelPassportBridgeClient; use LaravelPassportBridgeRefreshTokenRepository; use LaravelPassportBridgeScope; use LaravelPassportPassport; use LaravelPassportTokenRepository; use LeagueOAuth2ServerCryptKey; use LeagueOAuth2ServerEntitiesAccessTokenEntityInterface; use LeagueOAuth2ServerExceptionOAuthServerException; use LeagueOAuth2ServerExceptionUniqueTokenIdentifierConstraintViolationException; use LeagueOAuth2ServerResponseTypesBearerTokenResponse; /**  * Trait PassportToken  *  * @package AppTraits  */ trait PassportToken {     /**      * Generate a new unique identifier.      *      * @param int $length      *      * @throws OAuthServerException      *      * @return string      */     private function generateUniqueIdentifier($length = 40)     {         try {             return bin2hex(random_bytes($length));             // @codeCoverageIgnoreStart         } catch (TypeError $e) {             throw OAuthServerException::serverError(&#39;An unexpected error has occurred&#39;);         } catch (Error $e) {             throw OAuthServerException::serverError(&#39;An unexpected error has occurred&#39;);         } catch (Exception $e) {             // If you get this message, the CSPRNG failed hard.             throw OAuthServerException::serverError(&#39;Could not generate a random string&#39;);         }         // @codeCoverageIgnoreEnd     }     private function issueRefreshToken(AccessTokenEntityInterface $accessToken)     {         $maxGenerationAttempts = 10;         $refreshTokenRepository = app(RefreshTokenRepository::class);         $refreshToken = $refreshTokenRepository->getNewRefreshToken(); ????????$refreshToken-&gt;setExpiryDateTime((new?DateTimeImmutable())-&gt;add(Passport::refreshTokensExpireIn())); ????????$refreshToken-&gt;setAccessToken($accessToken); ????????while?($maxGenerationAttempts--?&gt;?0)?{ ????????????$refreshToken-&gt;setIdentifier($this-&gt;generateUniqueIdentifier()); ????????????try?{ ????????????????$refreshTokenRepository-&gt;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-&gt;getNewToken(new?Client($clientId,?null,?null),?[new?Scope("*")],?$user-&gt;id); ????????$accessToken-&gt;setIdentifier($this-&gt;generateUniqueIdentifier()); ????????$accessToken-&gt;setClient(new?Client($clientId,?null,?null)); ????????$accessToken-&gt;setExpiryDateTime((new?DateTimeImmutable())-&gt;add(Passport::tokensExpireIn())); ????????$accessTokenRepository-&gt;persistNewAccessToken($accessToken); ????????$refreshToken?=?$this-&gt;issueRefreshToken($accessToken); ????????return?[ ????????????'access_token'?=&gt;?$accessToken, ????????????'refresh_token'?=&gt;?$refreshToken, ????????]; ????} ????protected?function?sendBearerTokenResponse($accessToken,?$refreshToken) ????{ ????????$response?=?new?BearerTokenResponse(); ????????$response-&gt;setAccessToken($accessToken); ????????$response-&gt;setRefreshToken($refreshToken); ????????$privateKey?=?new?CryptKey('file://'.Passport::keyPath('oauth-private.key'),null,false); ????????$accessToken-&gt;setPrivateKey($privateKey); ????????$response-&gt;setPrivateKey($privateKey); ????????$response-&gt;setEncryptionKey(app('encrypter')-&gt;getKey()); ????????return?$response-&gt;generateHttpResponse(new?Response); ????} ????/** ?????*?@param?User?$user ?????*?@param?$clientId ?????*?@param?bool?$output ?????*?@return?mixed|PsrHttpMessageResponseInterface ?????*/ ????protected?function?getBearerTokenByUser(User?$user,?$clientId,?$output?=?true) ????{ ????????$passportToken?=?$this-&gt;createPassportTokenByUser($user,?$clientId); ????????$bearerToken?=?$this-&gt;sendBearerTokenResponse($passportToken['access_token'],?$passportToken['refresh_token']); ????????if?(!?$output)?{ ????????????$bearerToken?=?json_decode($bearerToken-&gt;getBody()-&gt;__toString(),?true); ????????} ????????return?$bearerToken; ????} } ??$user=User::find(2); ????????$token?=??$this-&gt;getBearerTokenByUser($user,6,false); ????????return?$token;

相關推薦:最新的五個Laravel視頻教程

以上就是填坑記錄:

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享