如何使用Yii和OpenID登录用户

如何使用Yii和OpenID登录用户,openid,yii,lightopenid,openid-selector,Openid,Yii,Lightopenid,Openid Selector,我已经将和添加到我的Yii web应用程序中,它确实对用户进行身份验证,并返回带有openid数据的url。下一步是使用OpenID提供程序中的数据在Yii中创建一个新标识以登录用户。Yii是如何做到这一点的 另外,我认为我需要创建一个openid表来存储openid,还需要将用户添加到我的用户表中。如果用户已经有一个帐户,那么将openid添加到他们的用户帐户以防止多个帐户 有人用Yii实现了所有这些吗?如果是这样,我会对它是如何实现的非常感兴趣。要将openID中的数据用作Yii登录,您可以

我已经将和添加到我的Yii web应用程序中,它确实对用户进行身份验证,并返回带有openid数据的url。下一步是使用OpenID提供程序中的数据在Yii中创建一个新标识以登录用户。Yii是如何做到这一点的

另外,我认为我需要创建一个openid表来存储openid,还需要将用户添加到我的用户表中。如果用户已经有一个帐户,那么将openid添加到他们的用户帐户以防止多个帐户


有人用Yii实现了所有这些吗?如果是这样,我会对它是如何实现的非常感兴趣。

要将openID中的数据用作Yii登录,您可以修改/覆盖UserIdentity类(受保护/组件)

覆盖现有的身份验证方法。 此时,您还可以设置当前的Yii用户名,如:

$this->username=$openId->username
(其中
$openId->username
应替换为包含openId用户名的变量)

通过覆盖side/login操作,可以调用修改后的方法,如下所示:

$identity=new UserIdentity("m","m");//where m is dummy
if($identity->authenticate()) {
           Yii::app()->user->login($identity);
[...]
}
//更新(由于您的评论): 不确定,如果我没弄错你的问题的话。但是在UserIdentity中添加一个新方法,比如authenticateOID(),又有什么意义呢。在原始authenticate()方法的开头调用此方法,如下所示:

if ($this->authenticateOID) {/*set username & return true to end the method here*/}
else {/*original authenticate method from Yii*/}

authenticateOID()
内部,您检查OID身份验证是否完成和/或用户是否仍在您的本地“OID-用户表”中

我自己没有使用过它,但我想知道是否可以将其与扩展集成?@ldg-包含openid,但我不需要整个用户管理,我对代码的理解还不够深入,无法了解他们是如何实现openid登录部分的。我刚开始用面向对象的方式编写代码,所以这也让它变得很困难。我没有在您提到的yii用户链接中看到openid。我不希望覆盖或更改当前身份验证,因为我需要登录注册用户和openid用户。我试图修改UserIdentity,但总是遇到需要用户名和密码的问题,因为我只有来自openid的用户名。我需要通过对照我的users表检查用户名来检查openid用户是否也是注册用户。抱歉,如果这没有意义…我是Yii和OOP新手。身份验证部分还可以,这是新的用户身份部分,我似乎无法解决。在OpenID登录被验证之后,我不需要再次验证它,至少我是这么想的。在用户通过OpenID进行身份验证后,我想创建一个新的用户标识,但是当前的Yii用户登录方法在登录时需要用户密码,而OpenID不需要用户密码,这是我似乎无法解决的问题。我在我的Yii应用程序中使用LDAP SSO,这与您的问题类似。在authenticate方法期间,我只需将
$this->username
设置为经过身份验证的用户/unique userID。因此
Yii::app()->user->login($identity)
工作正常,没有任何更改,也没有来自Yii的任何新登录/密码