9
votes

Yii 2 API REQUIFE Authentifiez avec OAUTH2 (Modèle avancé Yii 2)

L'API de repos fonctionne sans méthodes d'authentification. Maintenant, je voulais authentifier l'API de repos avec l'authentification OAuth2 pour les demandes d'API via une application mobile. J'ai essayé avec le guide Yii2, mais cela n'a pas fonctionné pour moi.

Essentiellement, l'utilisateur mobile doit être connecté avec nom d'utilisateur et mot de passe, si un nom d'utilisateur et un mot de passe sont corrects, l'utilisateur doit être connecté et une demande d'API supplémentaire doit être validée avec jeton. P>

Dois-je besoin de Créez un client de Oauth 2 personnalisé comme celui-ci? Création de vos propres clients P >

Access_Token champ dans la table utilisateur est vide. Dois-je le sauver manuellement? Comment retourner Access_Token comme une réponse? P>

Y a-t-il une raison quelconque de l'utilisateur toutes les trois méthodes (httpbasicauth, httpbeartauth, queryparauth) à la fois, pourquoi? comment? P>

Ma structure de dossiers d'application ressemble ci-dessous. P>

id
username
auth_key
password_hash
password_reset_token
email
status
created_at
access_token


2 commentaires

Avez-vous rencontré une solution?


Access_Token doit être Generatet manuellement (par exemple, SHA1 (UNIQID ())). Fondamentalement, après la connexion (nom d'utilisateur et mot de passe) reçu avec un jeton d'accès reçu et utilisez-le dans l'une des trois méthodes (httpbasicauth, httpbearerauth, QueryParamauth) dans toutes les autres demandes de serveur.


3 Réponses :


1
votes

Vous pouvez créer votre système d'authentification, généralement je le fais. Vous pouvez enregistrer des jetons pour chaque utilisateur et après avoir authentifier l'utilisateur par ce jeton. Dans chaque action, vous pouvez envoyer ce jeton pour authentifier l'utilisateur.


0 commentaires

1
votes

Vous devez faire ce qui suit:

  • Définissez le jeton avant d'enregistrer l'utilisateur dans le modèle utilisateur.
  • Ajoutez ActionLogin dans l'Uscontroller pour renvoyer l'auth_key sur l'utilisateur Connexion.
  • Dans chaque demande d'API, vous envoyez l'Auth_Key dans l'en-tête au lieu de Envoi de nom d'utilisateur et de mot de passe.
  • Pour vérifier si l'Auth_Key est valide, définissez «authentificateur» dans le Comportements USERCONTROLLER.

    Vous pouvez trouver des échantillons de code dans ma réponse à une autre question ICI


0 commentaires

6
votes

J'utilise JWT pour valider la demande. Fondamentalement, JWT est un jeton qui contient également des informations sur un utilisateur et sur le jeton lui-même tel que la validité et le temps d'expiration du jeton. Vous pouvez en savoir plus sur JWT ici .

Le flux de mon application est comme celui-ci: P>

  • Premièrement, lorsqu'un utilisateur connecté, créez un JWT pour l'utilisateur p>

    $behaviors['authenticator'] = [
        'class' => HttpBearerAuth::className(),
        'except' => ['login'] //action that you don't want to authenticate such as login
    ];
    
  • Ensuite, le client (E.g the Mobile App) doit fournir le jeton dans chaque demande via un en-tête d'autorisation. L'en-tête ressemblera à ceci: p>

    Autorisation: support [le jeton JWT sans support] code> p> li>

  • Dans le modèle utilisateur, ajoutez une méthode comme celle-ci pour valider le jeton: p>

    public static function findIdentityByAccessToken($token, $type = null) {
        $key = base64_decode('the same key that used in login function');
    
        try{
            $decoded = JWT::decode($token, $key, array('HS256'));
            return static::findByEmail($decoded->data->email);
        }catch (\Exception $e){
            return null;
        }
    }
    
  • Ensuite, ajoutez ceci à la fonction Comportements dans chaque contrôleur: P>

    $key = base64_decode('some_random_string');
    
    $tokenId = base64_encode(mcrypt_create_iv(32));
    $issuedAt = time();
    $notBefore = $issuedAt + 5;
    $expire = $notBefore + 1800;
    
    $user = User::findByEmail($email);
    
    $data = [
        'iss' => 'your-site.com',
        'iat' => $issuedAt,
        'jti' => $tokenId,
        'nbf' => $notBefore,
        'exp' => $expire,
        'data' => [
            'id' => $user->id,
            'username' => $user->username,
            //put everything you want (that not sensitive) in here
        ]
    ];
    
    $jwt = JWT::encode($data, $key,'HS256');
    
    return $jwt;
    


0 commentaires