Posted
Category 技术杂谈

SSO 单点登录是一种统一认证和授权机制,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。

单点登录有很多种方式,有基于 Cookie 的、也有现成的开源的单点登录框架,这里说说基于 Cookie 的跨域单点登录。

跨域的的单的登录主要需要解决的就是在浏览器把加密过的登录令牌发送到其他域名应用去,让每个应用完成身份认证。

常见的发送登录令牌方法有 JavaScript 文件引用, iFrame 调用, IMG 标签引用, JSONP 等..

这里比较推荐 JSONP 方式, 因为这种方式可以比较准确判断目标应用是否成功完成认证。


前端例子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>SSO Demo</title>
<script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
</head>
<body>
<!-- Passport 登录成功后的处理页面 -->
<script type="text/javascript">
var PASSPORT_TOKEN = '[加密后的令牌, 由服务端输出]';
$(document).ready(function () {
$.getJSON('http://a.com/sso.php?token=' + PASSPORT_TOKEN + '&jsoncallback=?', function (result) {
if (result.state == 'success')
{
// SSO 应用登录成功处理
}
else if (result.state == 'error')
{
// SSO 应用登录失败处理
}
});
});
</script>
</body>
</html>
view raw sso.html hosted with ❤ by GitHub

服务端例子:

<?php
if ($_GET['token'])
{
// 解密认证过程省略..
// 认证成功
if ($sso_valid)
{
$output = array(
'state' => 'success'
);
// 设置 Cookie
setcookie('user_login', '......');
}
else
{
$output = array(
'state' => 'error'
);
}
echo $_GET['jsoncallback'] . '(' . json_encode($output) . ')';
}
view raw sso.php hosted with ❤ by GitHub

2015/09/23 14:46 2015/09/23 14:46