当前位置: 代码迷 >> 综合 >> 【PHP SDK for OpenStack/Rackspace APIs】身份验证
  详细解决方案

【PHP SDK for OpenStack/Rackspace APIs】身份验证

热度:71   发布时间:2023-12-18 18:36:57.0

       在你使用php-opencloud之前必须先取得云服务提供商的身份验证。这是整个过程中最简单也是最让人沮丧的部分。 

说它最简单是因为你只需要两部分信息:

  • 云服务提供商的身份验证端点
  • 用来身份验证的证书

 

只要你通过了身份验证,云服务提供商就会向你提供一个服务目录(http://docs.rackspace.com/auth/api/v2.0/auth-client-devguide/content/Sample_Request_Response-d1e64.html),该目录包含了提供商所有不同服务的链接。你只要指定你想要使用的服务,提供商的库就会自动找到相应的链接。

 

首先你要确定你使用的是Rackspace云还是OpenStack云,包含对应的top-level文件。这些被叫做Connection类,他们用来建立授权用户和指定云部署之间的链接。他们在任何php-opencloud中都是需要的。

 

OpenStack云的身份验证

 

首先要包含top-level文件

<?php
require '/path/to/php-opencloud.php';

这可以让你通过简单的new OpenStack声明来访问OpenStack对象。如果你省略了use,你就不得不通过完整命名空间来范文OpenStack: new \OpenCloud\OpenStack。

接下来,使用相应的证书来创建OpenStack对象。

$endpoint = 'https://your-cloud-provider/path';
$credentials = array('username' => 'YOUR USERNAME','password' => 'YOUR PASSWORD'
);
$cloud = new OpenStack($endpoint, $credentials);

(注意:tenantname值不是所有的installations中都需要的)

在这个例子中,$credentials是一个关联数组 (或者哈希数组)Keysusernamepassword)是OpenStack分派给你的usernamepassword

 

Rackspace公有云的身份验证

首先要包含Rackspace命名空间的top-level:

<?php
use OpenCloud\Rackspace;

接下来,使用相应的证书创建Rackspace对象:

$endpoint = 'https://identity.api.rackspacecloud.com/v2.0/';
$credentials = array('username' => 'YOUR USERNAME','apiKey' => 'YOUR API KEY'
);
$cloud = new Rackspace($endpoint, $credentials);

用你自己账户的username和apikey来替换上面的。如果你没有API key,参见:https://mycloud.rackspace.com/a/`username`/account/api-keys。注意Rackspace英国用户和美国用户的$endpoint是不同的。

 

设置CRUL选项

Php-opencloud库使用标准CRUL方法执行HTTP请求。如果你要传递附加选项到CURL中,你可以把它们作为Rackspace和OpenStack可选的第三参数。这个参数必须是option/value对的关联数组。例如,如果你代码中要使用HTTP代理:

$options = array(CURLOPT_PROXY=>'proxy-name');
$cloud = new \OpenCloud\OpenStack($endpoint, $credentials, $options);

 

证书缓存

请注意,你只需要身份验证一次即可;php-opencloud库将把它们缓存在内存中重复使用直到过期为止,届时将自动重新验证。只有当你的凭证改变(比如更改了密码)或者使用了其他账户时,你才需要重新创建一个OpenStack或者Rackspace对象。

如果您的PHP进程是高度瞬态(例如, 每次在浏览器中浏览,web页面就重新加载),那么您可以缓存的凭据(例如,使用APC或本地磁盘文件),这样就不必为每个请求确认。Php-opencloud提供了两个方法来导出和导入证书。

反复重新验证可以产生身份验证服务器上的负载和可能降所有用户的低性能。此外,一些部署将会限制你的验证频率。

 

导出证书

OpenStack::ExportCredentials()方法可以以数组形式导出当前的证书(authorizationtoken, expiration, tenant ID,servicecatalog:

$cloud = new \OpenCloud\OpenStack('URL', array('username'=>'xx','password'=>'yy'));
$cloud->Authenticate(); // retrieves credentials from identity service
$arr = $cloud->ExportCredentials();
store_credentials_in_cache($arr);

在这个例子中,Authentiate()方法从身份服务中检索证书;store_credentials_in_cache()函数(不是php-opencloud提供的,这是一个虚构的例子)把证书存储到浏览器的APC缓存中。当然,你可以创建一个函数将证书保存到本地文件中,数据库中或者其他你需要的地方。

 

导入证书

OpenStack::ImportCredentials()方法用来导ExportCredentials()方法创建的证书数组:

$cloud = new \OpenCloud\OpenStack('URL', array('username'=>'xx','password'=>'yy'));
$arr = load_credentials_from_cache();
$cloud->ImportCredentials($arr);

这个例子中,假设的函数load_credentials_from_cache()读取ExportCredentials()方法之前保存的证书。

注意ImportCredentials()方法必须在其他OpenStack方法前使用。因为当需要token的时候OpenStack会重新验证。

$cloud = new \OpenCloud\OpenStack('URL', array('username'=>'xx','password'=>'yy'));
// this automatically re-authenticates against the identity service
$nova = $cloud->Compute(...);
// this accidentally overwrites the new credentials with the old one
$cloud->ImportCredentials(...);

也就是说,这可能不会提高效率,实际上这可能造成身份服务请求的数量成倍提高(因为缓存证书可能失效,迫使下次请求的时候重新验证)。

翻译自:https://github.com/rackspace/php-opencloud/blob/master/docs/userguide/authentication.md