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
3 Réponses :
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. P>
Vous devez faire ce qui suit: p>
Vous pouvez trouver des échantillons de code dans ma réponse à une autre question ICI P>
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>
Dans le modèle utilisateur, ajoutez une méthode comme celle-ci pour valider le jeton: p>
Ensuite, ajoutez ceci à la fonction Comportements dans chaque contrôleur: P>
Autorisation: support [le jeton JWT sans support] code> p> li>
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;
}
}
$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;
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.