主页 > Drupal | 其他 > 如何用Drupal做统一认证功能?

如何用Drupal做统一认证功能?

PDF版本

真正的统一认证一般指中心登录,drupal有很多相关的模块可以实现,比如Drupal SSO模块, 如果都是Drupal站点可以用bakery模块实现,也可以用CAS模块实现CAS服务。

oauth2.0

本文重点讲得是用open auth 2.0协议实现oauth服务,通过oauth协议实现统一认证的服务。

OAuth本质就是两个服务之间的通讯,通过一个服务授权另一个服务,通过认证,找了一个图片,添加了注释,如下所示:

oauth2

 

所需模块具体如下:

OAuth2_server:  https://www.drupal.org/project/oauth2_server

OAuth2_client:  https://www.drupal.org/project/oauth2_client

以及相应的OAuth2.0的PHP依赖包。

模块的安装和配置:

模块的安装,比较简单,下载安装以及下载依赖包。
模块的配置,主要是创建一个Oauth server,然后添加客户端。
创建一个Oauth server实例,注意选择授权类型,一般code和token都是要选的。

另外,创建一个Client实例的时候,要注意首次需填写密钥,另外要设置授权的URL,具体参考下面的截图:

Oauth Server配置:

oauth-server1

Oauth Server添加Client:

oauth-server2

 

四种授权模式:
Oauth2.0提供了四种授权模式,其中授权码模式是最经典常用的模式,具体4种如下:
1. 授权码(认证码)模式 (Authorization code) response_type=code
2. 简化(隐形)模式 (Impilict) response_type=token
3. 用户名密码模式 (Resource Owner Password Credential) grant_type=password
4. 客户端模式 (Client Credential) grant_type=client_credential

消费Oauth服务
使用Oauth服务可以用Drupal的Oauth client模块,也可以自己写一段代码测试。

授权发起页面:

$appid     = 'testapp';
$callback  = "http://testapp.demo.xiao-an.com/callback.php";
$callback  = urlencode($callback);
 
$state = $_SERVER['REQUEST_URI'];
$key   = substr(md5($state), 0, 8);
$type  = 'code'; //token
 
$home = 'http://uauth.demo.xiao-an.com';
$forward = "{$home}/oauth2/authorize?response_type={$type}&client_id={$appid}&redirect_uri={$callback}&state={$key}&scope=openid+unionlib_basic&source=unionlib";
 
header('Location: ' . $forward);

授权回调页面:

$code = $_REQUEST['code'];
$parameters = array(
    'client_id'  => $appid,
    'client_secret' => $appsecret,
    'grant_type' => 'authorization_code',
    'code' => $code,
    'redirect_uri' => 'http://testapp.demo.xiao-an.com/callback.php'
  );
$param_data = array(
   'data'   => _query_string_encode($parameters),
  );
$headers = array('Content-Type' => 'application/x-www-form-urlencoded');
$url  = 'http://uauth.demo.xiao-an.com/oauth2/token?' . _query_string_encode($parameters);
$http = _http_request($url, $headers, 'POST', _query_string_encode($parameters));
$data = json_decode($http->data);
var_dump($data);

其中http_request函数直接从drupal的函数库中复制过来。

通过第三方库实现统一认证

一般情况下,都是通过现有的第三方库实现统一认证,比如学生库、读者库等,所以要实现通过第三方库登录,还要做一些额外的工作。
1. 实现hook_user_login
因为模块的oauth直接使用drupal的login form实现用户名密码认证登录,所以直接实现这个hook即可。
2. 用户管理
通过远程的接口,自定义views的handler来实现远程用户管理。
此外,如果不希望用户通过默认的Drupal Login Form登录,自定义form的话,可以实现hook_oauth2_server_pre_authorize,如果用户没有登录,直接重定向到自定义form,认证完成之后再重定向回来。

我们针对某图书馆项目,实现完整的统一认证架构,具体可以下载说明文档:

统一认证系统架构及案例


声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。
本文有效链接: http://www.drupal001.com/2017/08/drupal-open-auth/
版权所有: Drupal与高性能网站架构 http://www.drupal001.com


,

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注


3 + 五 =

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

引用:0

下面所列的是引用到本博客的链接
如何用Drupal做统一认证功能? 来自 Drupal与高性能网站架构
顶部