2017-05-22 22:26:55 1959次浏览 3条回答 0 悬赏 10 金钱

首先说下我是一个新手,对YII不是很了解;

最近在网上看到YII支持好几种登录认证方式
1、请求参数方式: restful access token
2、HTTP 基本认证
3、OAuth 2

这三种我们经常用到的应该是第二种吧,用Session Cookie的方式

但是这里我对第一种access token特别的好奇,网上找了很多资料都是讲的要么高深莫测,要么云里雾里的,对于我这个新手来说很吃力呀;

所以在这里问一下有没有那位大神能细节的讲讲他的原理和实现方法,优缺点;

然后我们使用三种的那一种比较方便和比较好

最好有教程出来

万分感谢!

  • 回答于 2017-05-22 23:48 举报

    没研究过,要答案,那就把三种方式,都做了,自然就知道哪种方式适合在哪种情况下使用了。

  • 回答于 2017-05-23 01:13 举报

    关于access-token使用方法,
    1.确保的你的user表里面有access_token这个字段,至于存放什么值你自己看着办就好,但是要保证唯一性
    2.在你的controller里面加上下面的代码

    public function behaviors()
        {
            return ArrayHelper::merge([
                'authenticator' => [
                    'class' => CompositeAuth::className(),
                    'authMethods' => [
                        QueryParamAuth::className(),
                    ],
                ]
            ], parent::behaviors());
        }
    

    3.在你访问这个controller里面的action的时候,在url后面加上一个access-token的参数就可以了,access-token的值就是你存放在数据里面的值
    4.access-token原理,源码参照yii\filters\auth\QueryParamAuth

    public function authenticate($user, $request, $response)
        {
            $accessToken = $request->get($this->tokenParam);
            if (is_string($accessToken)) {
                $identity = $user->loginByAccessToken($accessToken, get_class($this));
                if ($identity !== null) {
                    return $identity;
                }
            }
            if ($accessToken !== null) {
                $this->handleFailure($response);
            }
    
            return null;
        }
    

    5.HTTP 基本认证原理,参照yii\filters\auth\HttpBearerAuth或yii\filters\auth\HttpBasicAuth

    public function authenticate($user, $request, $response)
        {
            $authHeader = $request->getHeaders()->get('Authorization');
            if ($authHeader !== null && preg_match('/^Bearer\s+(.*?)$/', $authHeader, $matches)) {
                $identity = $user->loginByAccessToken($matches[1], get_class($this));
                if ($identity === null) {
                    $this->handleFailure($response);
                }
                return $identity;
            }
    
            return null;
        }
    
    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);
                    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;
        }
    

    个人认为没什么好坏之分,根据不同的使用场景使用不同的方法吧

  • 回答于 2017-05-23 08:23 举报

    1,3 基本属于API开发使用, 2 属于常规网页开发,对于新手,先熟悉2就好了

    2 就是Yii默认的认证方式

您需要登录后才可以回答。登录 | 立即注册
xjcallen
见习主管

xjcallen 东莞

注册时间:2017-01-10
最后登录:2022-06-30
在线时长:6小时36分
  • 粉丝0
  • 金钱175
  • 威望0
  • 积分235

热门问题