Wie kann ich ein token zu erstellen, für die ein Kennwort Gewähren Client mit Laravel Pass?

Baue ich eine API und ich bin mit Laravel Pass für die Authentifizierung.

API verwendet wird für unsere mobile-app, damit wir das Passwort geben Client.

Alles funktioniert Super, und ein Benutzer kann sich anmelden, um ein Zugangs-token. Wir haben ein register Endpunkt, die es einem Benutzer ermöglicht, sich anzumelden. Wir müssen die API, um eine access-token in dieser Stelle zu.

Suche durch die docs gibt es keine Möglichkeit zum erstellen einer access-token programmgesteuert.

Wie kann ich eine access-token für ein Passwort geben Client in meinem controller? Ich offensichtlich nicht wollen, zu tun, eine HTTP-Anforderung an mein eigenes API, um es zu bekommen.

Ich weiß, ich kann mit einer Persönlichen Zugang Gewähren Client und rufen createToken auf die Benutzer-Modell, aber das bedeutet, dass der access-token in Verbindung mit einem anderen Client. Dies scheint nicht richtig zu mir.

InformationsquelleAutor Mike | 2017-07-10



4 Replies
  1. 4

    Probieren Sie etwas wie dieses

    class UserController extends Controller
    {
        protected function login(Request $request)
        {
    
             $request->request->add([
                'grant_type'    => 'password',
                'client_id'     => '3',
                'client_secret' => '6BHCRpB4tpXnQvC1DmpT7CXCSz7ukdw7IeZofiKn',
                'scope' => '*'
            ]);
    
            //forward the request to the oauth token request endpoint
            $tokenRequest = Request::create('/oauth/token','post');
            return Route::dispatch($tokenRequest);
        }
    
    }
    • Dieser Ansatz macht eine Anforderung, was bedeutet, dass, wenn Sie brauchen, um zu erzeugen ein token innerhalb einer anderen Anfrage, Sie haben eine lange Reaktionszeit.
  2. 2

    Ich habe liebäugelt mit Pass für ein paar Wochen jetzt, und von dem, was ich gesehen habe in der Dokumentation nicht aussetzen, viele der Methoden, die Sie verwendet für die Erstellung von Token. Während Sie vielleicht nicht in der Lage sein, um „erstellen Sie ein access-token für ein Passwort geben Client in meinem controller“ – was man tun kann, ist Route::dispatch zum weiterleiten der Anfrage für ein Zeichen, um Ihre Passport-Kennwort Gewähren route.

    Zu diesem Zweck den controller, den Sie verwenden, um die Ausgabe-Token, verwenden Sie die AuthenticatesUsers Charakterzug, so dass Sie Zugriff auf die Passwort-Grant-route, erstellen Sie eine Anfrage und senden Sie die Anforderung, um das Passwort zu Gewähren route:

    use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    use Illuminate\Support\Facades\Route;
    use Illuminate\Foundation\Auth\AuthenticatesUsers;
    
    class IssueTokensController extends Controller
    {
    
        use AuthenticatesUsers;
    
        protected function issueApiToken(Request $request)
        {
            //forward the request to the oauth token request endpoint
            $tokenRequest = Request::create(
                '/oauth/token',
                'post'
            );
            return Route::dispatch($tokenRequest);
        }
    
    }

    Diese Methode erfordert natürlich Sie haben Reisepass und ein Passwort geben Client.

    Diese Antwort basiert aus einer anderen Antwort auf eine ähnliche Frage von Raymond Lagonda – siehe https://stackoverflow.com/a/40433000/4991377

  3. 0

    Ich weiß, ich kann mit einer Persönlichen Zugang Gewähren Client und rufen createToken auf die Benutzer-Modell, aber das bedeutet, dass der access-token in Verbindung mit einem anderen Client

    nicht sicher, was Sie meinen, könnten Sie mehr erklären?

    Nun, das ist nicht ideal, aber Sie könnten in der Lage zu injizieren \League\OAuth2\Server\Grant\PasswordGrant und verwenden

    respondToAccessTokenRequest(ServerRequestInterface $request 
                                ResponseTypeInterface $responseType,
                                \DateInterval $accessTokenTTL)

    würden Sie schaffen müssen, um all die Objekte, aber dies ist die einzige öffentliche Methode für das Passwort wird jedes token mit Informationen.

  4. 0

    Patrick hat die richtige Idee, und das ist, was ich am Ende machen:
    (Ich glaube nicht, dass Sanju ‚ s Antwort ist richtig, weil Sie brauchen, um einen http-request)

    <?php
    
    namespace MyApp\Http\Controllers\API;
    
    use Illuminate\Http\Request;
    use Laravel\Passport\Http\Controllers\ConvertsPsrResponses;
    use League\OAuth2\Server\AuthorizationServer;
    use MyApp\Http\Controllers\APIController;
    use Illuminate\Auth\AuthenticationException;
    use Zend\Diactoros\ServerRequest;
    use Zend\Diactoros\Response as Psr7Response;
    
    class LoginController extends APIController
    {
    
        use ConvertsPsrResponses;
    
        /**
         *
         * @param Request $request
         * @param AuthorizationServer $authServer
         * @return \Illuminate\Http\JsonResponse
         * @throws AuthenticationException
         * @throws \League\OAuth2\Server\Exception\OAuthServerException
         */
        public function login(Request $request, AuthorizationServer $authServer)
        {
            $token = $this->getPasswordToken($request, $authServer);
            $data = [
                "token_details" => $token,
            ];
    
            return $this->successResponse(
                'Successful Login',
                200,
                $data
            );
    
        }
    
    
        /**
         * @param $request
         * @param AuthorizationServer $authServer
         * @return mixed
         * @throws \League\OAuth2\Server\Exception\OAuthServerException
         */
        private function getPasswordToken($request, AuthorizationServer $authServer)
        {
            $parsedBody = [
                'grant_type' => 'password',
                'client_id' => config('app.client_id'),
                'client_secret' => config('app.client_secret'),
                'username' => $request->username,
                'password' => $request->password,
                'scope' => '',
            ];
    
            $serverRequest = new ServerRequest(
                $request->server(),
                [],
                null,
                $request->method(),
                'php://input',
                $request->header(),
                [],
                [],
                $parsedBody
            );
    
            $response = $this->convertResponse(
                $authServer->respondToAccessTokenRequest($serverRequest, new Psr7Response)
            );
            return json_decode($response->getContent());
        }
    
    }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.