laravel passport 與手機簡訊登入結合的問題記錄

chowjiawei發表於2021-12-15

準備步驟

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介面的程式碼如下:

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Psr\Http\Message\ServerRequestInterface;
use \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Validator;

class AccessTokenController extends \Laravel\Passport\Http\Controllers\AccessTokenController
{
    /**
     * 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 = \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);
    }
}

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

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章