我是阿北,Yii学习社群正在搞技术文竞赛(获胜者送VIP权限),邀请你参加。 另外我的订阅号送书中,看详情
阿北
阿北 发布于 3个月前

2018-03-07 / [PHP] 一道RESTFUL的题目 [APP+]一道字符串查找问题

PHP

我们知道在使用RESTFUL做认证的时候需要生成一个accessToken,客户端在调用需要认证接口时候需要提供accessToken,这样就可以判断出是否可操作资源。

我的题面需要为accessToken增加一个过期时间,生成accessToken后一小时内有效。

请在留言里写出你的方案。

APP+

这是一道js题目,需求很简单,使用es6语法或js实现均可以。

判断“中华人民共和国”这个字符串中是否是以“共和国”子字符串结尾的?

请在留言中标记你要回答的是PHP还是APP+

/////////////

我的答案在5楼

1-5条,共5条数据.
张张张🇨🇳梦
3个月前
# 554

简单的一批.... jwt + redis。 redis保存token开始时间和过期时间即可

瓜尔佳.维佳
3个月前
# 555

php:accesstoken放入redis中,设置失效时长为1小时,api获取参数后对比redis,可放在nginx中使用lua验证

Aries°
3个月前
# 556

用户登录的时候生成一个唯一性字符串同时存放在数据库和session中,并且设置session的过期时间为1个小时,调用接口的时候通过存放在数据库的值和session中的值进行比对

太空刘
3个月前
# 557

我可以设置缓存一小时,一小时之后,accessToke丢失,这样可以吗?

阿北
3个月前
# 558

感谢大家的提问,我在这里也提供一种方案,这种方案不利用第三方进行存储。我们都知道在yii2的restful中,其实我们是通过User.php的findIdentityByAccessToken来得到用户的accessToken的。

首先修改findIdentityByAccessToken

public static function findIdentityByAccessToken($token){
  if($user = User::findOne(["access_token"=>$token])){
    return $user->isAccessTokenValid() ? $user : null;
  }
  return null;
}

在这里我们通过一个叫做isAccessTokenValid的函数判断当获取accessToken的时候当前token是否有效。

验证当前token是否有效

public function isAccessTokenValid(){
    if (!empty($this->access_token)) {
        $timestamp = (int) substr($this->access_token, strrpos($this->access_token, '_') + 1);
        return $timestamp > time();
    }
    return false;
}

这里我们并没有进行存储,而是将用户的token分成了2部分,token_生成token一刻的时间戳,好处是不依赖于任何存储媒介。

生成token逻辑 现在我们要升级生成token的逻辑,如下代码

public function generateAccessToken($expireInSeconds){
    $this->access_token = Yii::$app->security->generateRandomString() . '_' . (time() + $expireInSeconds);
}
-
在线