1

私はdingo/api ( jwt-auth のサポートが組み込まれている) を使用して API を作成しています。

これが私のルートだとします:

$api->group(['prefix' => 'auth', 'namespace' => 'Auth'], function ($api) {
            $api->post('checkPhone', 'LoginController@checkPhone');

            //Protected Endpoints
            $api->group(['middleware' => 'api.auth'], function ($api) {
                $api->post('sendCode', 'LoginController@sendCode');
                $api->post('verifyCode', 'LoginController@verifyCode');

            });
        });

checkPhoneトークンを承認して作成するタスクを持つメソッドは次のようになります。

public function checkPhone (Request $request)
        {
            $phone_number = $request->get('phone_number');
            if (User::where('phone_number', $phone_number)->exists()) {

                $user = User::where('phone_number', $phone_number)->first();

                $user->injectToken();

                return $this->response->item($user, new UserTransformer);

            } else {
                return $this->response->error('Not Found Phone Number', 404);
            }
        }

モデルのinjectToken()メソッドUserは次のとおりです。

public function injectToken ()
        {
            $this->token = JWTAuth::fromUser($this);
            return $this;
        } 

トークンの作成は正常に機能します。

しかし、保護されたエンドポイントに送信すると、常にUnable to authenticate with invalid token発生します。

保護されたエンドポイント アクション メソッドは次のとおりです。

public function verifyCode (Request $request)
        {
            $phone_number = $request->get('phone_number');
            $user_code    = $request->get('user_code');

            $user = User::wherePhoneNumber($phone_number)->first();

            if ($user) {
                $lastCode = $user->codes()->latest()->first();

                if (Carbon::now() > $lastCode->expire_time) {
                    return $this->response->error('Code Is Expired', 500);
                } else {
                    $code = $lastCode->code;

                    if ($user_code == $code) {

                        $user->update(['status' => true]);

                        return ['success' => true];
                    } else {
                        return $this->response->error('Wrong Code', 500);
                    }
                }
            } else {
                return $this->response->error('User Not Found', 404);
            }
        }

PostManはAPIクライアントとして使用し、生成されたトークンを次のようなヘッダーとして送信します:

Authorization:Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI5ODkxMzk2MTYyNDYiLCJpc3MiOiJodHRwOlwvXC9hcGkucGFycy1hcHAuZGV2XC92MVwvYXV0aFwvY2hlY2tQaG9uZSIsImlhdCI6MTQ3NzEyMTI0MCwiZXhwIjoxNDc3MTI0ODQwLCJuYmYiOjE0NzcxMjEyNDAsImp0aSI6IjNiMjJlMjUxMTk4NzZmMzdjYWE5OThhM2JiZWI2YWM2In0.EEj32BoH0URg2Drwc22_CU8ll--puQT3Q1NNHC0LWW4

Web や関連するリポジトリを何度も検索しても解決策が見つかりません。

あなたの意見では、問題は何ですか?

アップデート :

laravel が提供する loginController のコンストラクターのエラーが見つからないことがわかりました。

public function __construct ()
        {
            $this->middleware('guest', ['except' => 'logout']);
        }

私がコメントしたとき、$this->middleware('guest', ['except' => 'logout']);すべてがうまくいったからです。しかし、この行を削除すると正しいですか? API の場合、この行はどうあるべきですか?

4

3 に答える 3

0

以前に更新メモの問題として述べたように、コンストラクターでゲストのチェックを行う LoginControllerを使用checkPhoneしました。verifyCode

また、guestミドルウェアが参照し\App\Http\Middleware\RedirectIfAuthenticated::class、ログインしているユーザーを/homeディレクトリにリダイレクトするため、それを作成していないため、404 error発生しました。

今、これらのメソッドを、UserControllerコンストラクターにミドルウェアなしでに移動しました。

于 2016-10-23T07:06:43.460 に答える
0

何が起こっているのかを確認するために、常にソースを読む価値があります。回答: は、ユーザーを取得するために認証プロバイダーの識別子を期待しています。

/**
 * Authenticate request with a JWT.
 *
 * @param \Illuminate\Http\Request $request
 * @param \Dingo\Api\Routing\Route $route
 *
 * @return mixed
 */
public function authenticate(Request $request, Route $route)
{
    $token = $this->getToken($request);

    try {
        if (! $user = $this->auth->setToken($token)->authenticate()) {
            throw new UnauthorizedHttpException('JWTAuth', 'Unable to authenticate with invalid token.');
        }
    } catch (JWTException $exception) {
        throw new UnauthorizedHttpException('JWTAuth', $exception->getMessage(), $exception);
    }

    return $user;
}
于 2018-01-29T00:36:12.863 に答える