stylers-llc/chopra-account-php-sdk
Chopra 单点登录系统的SDK。
Requires
- php: >=5.4
This package is not auto-updated.
Last update: 2024-09-14 19:25:36 UTC
README
-
PHP <= 5.4
-
PHP Memcache模块
-
OpenSSL模块
-
PECL Hash <= 1.1 (https://php.ac.cn/manual/en/function.hash-hmac.php)
-
PHP CURL模块
SDK结构
Client.php: 客户端主类。每次需要用户会话时,都需要实例化这个类。
Api.php: 负责API连接和通信。不需要实例化,由Client.php完成。
Session.php: 负责用户会话管理。不需要实例化,由Client.php完成。
它使用memcache连接进行会话管理;因此需要在服务器上启用php_memcache模块。
SDK中(尚未)有自动加载器,因此每个运行时都需要将这三个文件放入“require”子句中,或者通过私有自动加载解决方案进行加载。
操作流程
标准集成流程
如何将此SDK集成到您的系统的流程图可以在这里找到:这里。
实例化
在需要用户会话的每个运行中,必须使用适当的参数实例化Client类(在中间件中或初始化期间,或在引导过程中)
$client = new Client([ 'client_key' => '[your_client_key]', 'client_secret' => '[your_32_chars_client_secret]', 'session_host' => '[memcache_host_name]', 'session_port' => '[memcache_port]', 'endpoint_basepath' => 'http://account.chopra.com/', 'api_key' => '[api_secret_key]', 'api_endpoint' => 'http://account-api.chopra.com/', 'cookie_domain' => '[cookie_domain]' ]);
Client参数
- endpoint_basepath:仅在开发环境中需要 - SDK中已预定义了实时域名。
- api_endpoint:api_endpoint仅在开发环境中需要 - SDK中已预定义了实时域名。
- cookie_domain:cookie域名是可选的。如果未提供,则SDK会从$_SERVER请求参数中生成它。它必须是您系统的顶级域名。如果您为同一认证系统使用多个子域名,则应提供不带子域名的顶级域名。如果您的整个网站都在子域名上,则必须提供带子域名的完整域名,例如:ayurveda.chopra.com
注意:上面的代码和会话检查以下重定向必须只在由浏览器发起的http请求时运行,或在其他需要的情况下运行。不要在系统由cron作业请求或以CLI运行时包含它。
会话检查
需要在每个运行中检查:SSO会话中存储了哪个用户。
可以按照以下方式完成
try { // it throws an exception if there is no cookie or it is wrong or it has a invalid session ID $ssoUser = $client->getUser(); } catch (SSOAuthException $e) { // in this case you should redirect to SSO check URL which restore the user session from an existing session ID or if the user is not logged in (there is no existing session) then creates a guest session header('Location: ' . $client->getCheckUrl('http://[yourhost.tld]')); // you have to provide the redirect URL as parameter where the SSO should redirect back to. It can be any URL where this code snippet runs again. You can redirect to any URL because this code should be executed at each runtime. }
重定向
重定向后,必须检查并处理SSO的响应,就像任何其他OAuth / SSO解决方案一样。这是通过getUser方法自动完成的(如上3.2节中所述)。当getUser方法返回member类型用户时,可以使用它进行本地用户处理(存储在本地数据库中,与现有本地用户关联,在全局范围内进行运行时存储等)
当返回的用户数组是guest类型时,这意味着没有登录的SSO用户,并且返回的数组如下所示:[ '_auth_type' => 'guest' ]
启动SSO登录过程
完成以上过程后,Client类-object方法memberLoggedIn()可以检查是成员类型会话还是访客类型会话,然后在SSO登录页面上写入一个链接,以便用户可以开始该过程
if (!$client->memberLoggedIn()) { // we display an SSO login URL. // for the getLoginUrl params you have to give a redirect URL also echo '<a href="' . $client->getLoginUrl('http://[yourhost.tld]') . '">Login with SSO</a>'; }
在重定向到SSO并成功登录或注册后,返回页面时,我们会在$ssoUser中获取完整的用户数组,其中包含所有用户数据。(如上文中3.2节提到的try-catch程序分支需要在每次运行时发生,以确保$ssoUser变量始终存在。)
注意:method memberLoggedIn只能在成功会话检查后调用。如果在3.2节中的代码返回SSOAuthException,则必须按上述描述进行重定向以检查url。
登出
客户端类的getLogoutUrl()方法返回一个URL,浏览器需要重定向到该URL。此方法还期望一个redirect_url参数。
if ($client->memberLoggedIn()) { echo $client->getLogoutUrl('http://[yourhost.tld]'); }
在SSO页面更新个人资料
客户端类的getProfileEditUrl()方法返回一个URL,浏览器需要重定向到该URL。此方法还期望一个redirect_url参数,用于在完成个人资料修改后重定向浏览器。
if ($client->memberLoggedIn()) { echo $client->getProfileEditUrl('http://[yourhost.tld]'); }
启动SSO社交登录过程
本地社交认证
作为第一步,需要执行本地链接的社交认证。这可以是Facebook或Google。
重定向到SSO社交登录页面
接下来,用户需要重定向到带有社交数据的sso社交登录页面。下面的示例将无法运行,因为example.php中的代码片段需要通过本地社交认证获得的社交ID和社交Token。
if (!$client->memberLoggedIn()) { echo '<a href="' . $client->getLoginUrl('http://[yourhost.tld]') . '">Login with SSO</a>'; echo '<a href="' . $client->getSocialLoginUrl('http://[yourhost.tld]', 'google', ['id' => '{social_id}', 'token' => '{social_token}' ]) . '">Login with social</a>'; }
getSocialLoginUrl的参数
-
redirect_url,在成功登录后SSO重定向到这里
-
社交网络类型,选项:google、facebook
-
在PHP数组中:['id' => '{social_id}', 'token' => '{social_token}'] - 显然,社交ID和社交Token必须替换为正确的值。这两个值是必需的,不能为空或空字符串,否则SDK将引发异常。
重定向后的处理工作流程与正常登录的情况相同。
在本地社交认证后,您可以重定向用户回到getSocialLoginUrl方法返回的返回URL。
为SSO用户创建Sage用户ID
默认情况下,getUser方法返回的用户数据包含用户的Sage用户ID。如果不包含,您可以通过对SSO API端点的简单API调用轻松为SSO用户创建Sage用户ID。如果用户不存在于Sage系统中,它将自动创建。您可以使用SDK这样做:
$postData = [ 'zip_code' => '1234', // any zip code, required by Sage system 'user_id' => '342567' // SSO User ID ]; $sageUser = $client->api()->makeCall( 'mas_user_id', 'POST', [], $postData );