Yii2 REST API BasicAuth काम नहीं कर रहा है




yii2-advanced-app yii2-user (2)

मैं निम्नलिखित एपीआई प्रमाणीकरण मॉड्यूल को निम्न चरण के रूप में लागू कर रहा हूं 1. व्यवस्थापक 2 द्वारा उपयोगकर्ता बनाएं। प्रथम टिम: access_token लौटने के लिए मूलभूत प्रमाण द्वारा लॉगिन 3. Auth उपयोगकर्ता के लिए step2 पर access_token का उपयोग करके। QueryParamAuth

इस निर्देश के रूप में यह क्वेरी पैराअथ https://github.com/yiisoft/yii2/blob/master/docs/guide/rest-authentication.md के साथ काम करता है

लेकिन यह चरण 2 पर काम नहीं करता है। BasicAuth द्वारा प्रमाणिकता I इसे डिबग। $this->auth हमेशा रिक्त वापसी करते हैं यद्यपि $username और $password सही है

class HttpBasicAuth extends AuthMethod
/**
 * @var callable a PHP callable that will authenticate the user with the HTTP basic auth information.
 * The callable receives a username and a password as its parameters. It should return an identity object
 * that matches the username and password. Null should be returned if there is no such identity.
 *
 * The following code is a typical implementation of this callable:
 *
 * ```php
 * function ($username, $password) {
 *     return \app\models\User::findOne([
 *         'username' => $username,
 *         'password' => $password,
 *     ]);
 * }
 * ```
 *
 * If this property is not set, the username information will be considered as an access token
 * while the password information will be ignored. The [[\yii\web\User::loginByAccessToken()]]
 * method will be called to authenticate and login the user.
 */
public $auth;
public function authenticate($user, $request, $response)
{
    $username = $request->getAuthUser();
    $password = $request->getAuthPassword();
    if ($this->auth) {
        if ($username !== null || $password !== null) {
            $identity = call_user_func($this->auth, $username, $password);
            var_dump($identity);
            die();
            if ($identity !== null) {
                $user->switchIdentity($identity);
            } else {
                $this->handleFailure($response);
            }
            return $identity;
        }
    } elseif ($username !== null) {
        $identity = $user->loginByAccessToken($username, get_class($this));
        if ($identity === null) {
            $this->handleFailure($response);
        }
        return $identity;
    }

    return null;
}

मेरा प्रश्न यह है कि मैं $ the-> auth फ़ंक्शन कैसे लागू कर सकता हूं?


मैं अपने नियंत्रक में HttpBasicAuth->auth को कार्यान्वित HttpBasicAuth->auth हूं जहां मैं HttpBasicAuth को ऐसे व्यवहार के रूप में संलग्न करता HttpBasicAuth :

class MyController extends Controller
{
    public function behaviors()
    {
        $behaviors = parent::behaviors();

        $behaviors['authenticator'] = [
            'class' => HttpBasicAuth::className(),
            'auth' => [$this, 'auth']
        ]

        return $behaviors;
    }

    public function auth($username, $password)
    {
        // Do whatever authentication on the username and password you want.
        // Create and return identity or return null on failure
    }

    // ... Action code ...
}

HTTP मूलभूत प्रमाण

// नियंत्रक कोड

मार्ग 1 : उपयोगकर्ता auth auth-token का उपयोग कर

use yii\filters\auth\HttpBasicAuth;

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => HttpBasicAuth::className(),
    ];
    return $behaviors;
}

उपरोक्त कोड एक्सेस टोकन द्वारा उपयोगकर्ता को मान्य करेगा (जैसा कि डॉक्टर में उल्लिखित है)

जब विंडो उपयोगकर्ता नाम और पासवर्ड दर्ज करने का संकेत देती है

उपयोगकर्ता नाम: hErEaccE55T0ken

पारण शब्द:

मार्ग 2 : यूज़रनेम और पासवर्ड , नमूना कोड (क्रिस कोड काम करता है) का उपयोग करके कस्टम ऑथ को कार्यान्वित करने के लिए

user_email का उपयोग कर im, user_password

public $user_password;


public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => HttpBasicAuth::className(),
        'auth' => [$this, 'auth']
    ];
    return $behaviors;
}

/**
 * Finds user by user_email and user_password
 *
 * @param string $username
 * @param string $password
 * @return static|null
 */
public function Auth($username, $password) {
    // username, password are mandatory fields
    if(empty($username) || empty($password))
        return null;

    // get user using requested email
    $user = \app\models\User::findOne([
        'user_email' => $username,
    ]);

    // if no record matching the requested user
    if(empty($user))
        return null;

    // hashed password from user record
    $this->user_password = $user->user_password;

    // validate password
    $isPass = \app\models\User::validatePassword($password);

    // if password validation fails
    if(!$isPass)
        return null;

    // if user validates (both user_email, user_password are valid)
    return $user;
}