下面由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->all(),?[ ????????????'username'?=>?'required', ????????????'password'?=>?'required', ????????])->validate(); ????????$checkUser?=?AppModelsUser::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('LaravelPassportTokenRepository'); ????????????$tokenRepository->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('An unexpected error has occurred'); } catch (Error $e) { throw OAuthServerException::serverError('An unexpected error has occurred'); } catch (Exception $e) { // If you get this message, the CSPRNG failed hard. throw OAuthServerException::serverError('Could not generate a random string'); } // @codeCoverageIgnoreEnd } private function issueRefreshToken(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; ????????????????} ????????????} ????????} ????} ????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|PsrHttpMessageResponseInterface ?????*/ ????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視頻教程
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦