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

 2588

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

准备步骤

laravel passport 环境

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


坑一

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


坑二

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

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

access_token 接口的代码如下:

  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use Illuminate\Support\Facades\Auth;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Support\Facades\Hash;
  6. use Psr\Http\Message\ServerRequestInterface;
  7. use \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
  8. use Validator;
  9. class AccessTokenController extends \Laravel\Passport\Http\Controllers\AccessTokenController
  10. {
  11.     /**
  12.      * Show User Token
  13.      *
  14.      * 获取用户登录令牌信息
  15.      *
  16.      * @bodyParam username string required 用户名 Example: admin@localhost.com
  17.      * @bodyParam password string required 密码 Example: 123456
  18.      * @bodyParam is_register boolean  是否为注册操作 Example: true
  19.      * @bodyParam subscribe boolean  订阅状态 Example: true
  20.      * @bodyParam grant_type string 授权类型默认password No-example
  21.      * @bodyParam scope string 授权范围默认* No-example
  22.      * @responseFile responses/AccessToken.List.example2.json
  23.      */
  24.     public function issueToken(ServerRequestInterface $rawRequest)
  25.     {
  26.         //获取传入参数
  27.         $request = collect($rawRequest->getParsedBody());
  28.         $validator = Validator::make($request->all(), [
  29.             'username' => 'required',
  30.             'password' => 'required',
  31.         ])->validate();
  32.         $checkUser = \App\Models\User::where("id", $request->get("username"))->first();
  33.         if (!Hash::check($request->get("password"), $checkUser->password)) {
  34.             throw new UnauthorizedHttpException('Unauthenticated', "login failed,username error or password error");
  35.         }
  36.         $oauthClient = DB::table('oauth_clients')->where("password_client", 1)->first();
  37.         if (empty($oauthClient)) {
  38.             throw new \ErrorException('can not get oauth client information');
  39.         }
  40.         //获取其他参数
  41.         $addRequest = [
  42.             'grant_type' => $request->get("grant_type", "password"),
  43.             'client_id' => $request->get("client_id", $oauthClient->id),
  44.             'client_secret' => $request->get("client_secret", $oauthClient->secret),
  45.             'scope' => $request->get("scope", "*"),
  46.         ];
  47.         //重写传入参数
  48.         $newRawRequest = $rawRequest->withParsedBody(array_merge($request->all(), $addRequest));
  49.         return parent::issueToken($newRawRequest);
  50.     }
  51.     /**
  52.      * revoke token
  53.      *
  54.      * 吊销令牌
  55.      *
  56.      */
  57.     public function revokeToken()
  58.     {
  59.         if(Auth::user()){
  60.             $tokenId = Auth::user()->token()->id;
  61.             $tokenRepository = app('Laravel\Passport\TokenRepository');
  62.             $tokenRepository->revokeAccessToken($tokenId);
  63.         }
  64.         return response('', 204);
  65.     }
  66. }

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

找到了另一种 更好的

  1. <?php
  2. namespace App\Traits;
  3. //这里请引用自己的User Model
  4. use App\Models\Users\User;
  5. use DateTime;
  6. use GuzzleHttp\Psr7\Response;
  7. use Illuminate\Events\Dispatcher;
  8. use Laravel\Passport\Bridge\AccessToken;
  9. use Laravel\Passport\Bridge\AccessTokenRepository;
  10. use Laravel\Passport\Bridge\Client;
  11. use Laravel\Passport\Bridge\RefreshTokenRepository;
  12. use Laravel\Passport\Bridge\Scope;
  13. use Laravel\Passport\Passport;
  14. use Laravel\Passport\TokenRepository;
  15. use League\OAuth2\Server\CryptKey;
  16. use League\OAuth2\Server\Entities\AccessTokenEntityInterface;
  17. use League\OAuth2\Server\Exception\OAuthServerException;
  18. use League\OAuth2\Server\Exception\UniqueTokenIdentifierConstraintViolationException;
  19. use League\OAuth2\Server\ResponseTypes\BearerTokenResponse;
  20. /**
  21.  * Trait PassportToken
  22.  *
  23.  * @package App\Traits
  24.  */
  25. trait PassportToken
  26. {
  27.     /**
  28.      * Generate a new unique identifier.
  29.      *
  30.      * @param int $length
  31.      *
  32.      * @throws OAuthServerException
  33.      *
  34.      * @return string
  35.      */
  36.     private function generateUniqueIdentifier($length = 40)
  37.     {
  38.         try {
  39.             return bin2hex(random_bytes($length));
  40.             // @codeCoverageIgnoreStart
  41.         } catch (\TypeError $e) {
  42.             throw OAuthServerException::serverError('An unexpected error has occurred');
  43.         } catch (\Error $e) {
  44.             throw OAuthServerException::serverError('An unexpected error has occurred');
  45.         } catch (\Exception $e) {
  46.             // If you get this message, the CSPRNG failed hard.
  47.             throw OAuthServerException::serverError('Could not generate a random string');
  48.         }
  49.         // @codeCoverageIgnoreEnd
  50.     }
  51.     private function issueRefreshToken(AccessTokenEntityInterface $accessToken)
  52.     {
  53.         $maxGenerationAttempts = 10;
  54.         $refreshTokenRepository = app(RefreshTokenRepository::class);
  55.         $refreshToken = $refreshTokenRepository->getNewRefreshToken();
  56.         $refreshToken->setExpiryDateTime((new \DateTimeImmutable())->add(Passport::refreshTokensExpireIn()));
  57.         $refreshToken->setAccessToken($accessToken);
  58.         while ($maxGenerationAttempts-- > 0) {
  59.             $refreshToken->setIdentifier($this->generateUniqueIdentifier());
  60.             try {
  61.                 $refreshTokenRepository->persistNewRefreshToken($refreshToken);
  62.                 return $refreshToken;
  63.             } catch (UniqueTokenIdentifierConstraintViolationException $e) {
  64.                 if ($maxGenerationAttempts === 0) {
  65.                     throw $e;
  66.                 }
  67.             }
  68.         }
  69.     }
  70.     protected function createPassportTokenByUser(User $user, $clientId)
  71.     {
  72.         $accessTokenRepository = new AccessTokenRepository(new TokenRepository(), new Dispatcher());
  73.         $accessToken = $accessTokenRepository->getNewToken(new Client($clientId, null, null), [new Scope("*")], $user->id);
  74.         $accessToken->setIdentifier($this->generateUniqueIdentifier());
  75.         $accessToken->setClient(new Client($clientId, null, null));
  76.         $accessToken->setExpiryDateTime((new \DateTimeImmutable())->add(Passport::tokensExpireIn()));
  77.         $accessTokenRepository->persistNewAccessToken($accessToken);
  78.         $refreshToken = $this->issueRefreshToken($accessToken);
  79.         return [
  80.             'access_token' => $accessToken,
  81.             'refresh_token' => $refreshToken,
  82.         ];
  83.     }
  84.     protected function sendBearerTokenResponse($accessToken, $refreshToken)
  85.     {
  86.         $response = new BearerTokenResponse();
  87.         $response->setAccessToken($accessToken);
  88.         $response->setRefreshToken($refreshToken);
  89.         $privateKey = new CryptKey('file://'.Passport::keyPath('oauth-private.key'),null,false);
  90.         $accessToken->setPrivateKey($privateKey);
  91.         $response->setPrivateKey($privateKey);
  92.         $response->setEncryptionKey(app('encrypter')->getKey());
  93.         return $response->generateHttpResponse(new Response);
  94.     }
  95.     /**
  96.      * @param User $user
  97.      * @param $clientId
  98.      * @param bool $output
  99.      * @return mixed|\Psr\Http\Message\ResponseInterface
  100.      */
  101.     protected function getBearerTokenByUser(User $user, $clientId, $output = true)
  102.     {
  103.         $passportToken = $this->createPassportTokenByUser($user, $clientId);
  104.         $bearerToken = $this->sendBearerTokenResponse($passportToken['access_token'], $passportToken['refresh_token']);
  105.         if (! $output) {
  106.             $bearerToken = json_decode($bearerToken->getBody()->__toString(), true);
  107.         }
  108.         return $bearerToken;
  109.     }
  110. }
  111. $user=User::find(2);
  112. $token =  $this->getBearerTokenByUser($user,6,false);
  113. return $token;


本文网址:https://www.zztuku.com/detail-10571.html
站长图库 - 填坑记录:laravel passport与手机短信登录结合
申明:本文转载于《learnku》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐