-2

我正在慢慢学习如何为我的网站开发 iPhone 应用程序……我已经阅读了很多教程,也阅读了很多关于苹果开发者部分的内容。

当我开始时,我问了一个问题'与我的 Web 应用程序交互的最佳方式是什么',我得到了 RESTful 服务的答案,所以我在我的 php 应用程序上安装了 restful,这一切都很好,我对此很满意。

我的网络应用程序是一个会员系统,我希望人们在他们的 iphone 上使用当前的网络应用程序进行身份验证,如果他们有一个帐户,很好,让他们进入,如果他们没有,然后显示错误消息。

不过,我有点困惑,我想知道是否有人可以帮助我。

我不希望任何人能够查看来自 restful 服务的响应,所以我认为我实现了密钥,现在,系统上的每个用户是否需要他们自己的密钥才能让他们的 iphone 应用程序访问 rest api,如果是这样,怎么做如果他们首先需要密钥,我会运行身份验证?

或者,应用程序是否只需要一个密钥来访问 api,然后通过用户身份验证完成其他所有操作......如果是这样,那么一个密钥肯定不会那么难破解,人们是否可以拆卸应用程序显示访问 api 的 api 密钥?

对此的任何想法将不胜感激......甚至是人们如何处理 php 和 ios 中的身份验证和休息服务的示例。

非常感谢!

4

2 回答 2

1

创建您的密钥、sha1 或任何您喜欢的算法。确保您的 Web 服务只能通过 https 访问,然后将密钥嵌入到您的请求标头中。是的 ASIHTTPRequest 已贬值,但 AFNetworking 是一个很好的替代品https://github.com/AFNetworking/AFNetworking。在您的 PHP 方面,首先确保您的标头中的 auth 密钥有效,如果是,则进一步验证通过 POST 传递的用户名和密码。这应该可以帮助您,如果您仍然需要帮助,我可以明天发布代码...


更新 - 在下面添加代码

尝试这个...

// setup httpClient
NSURL *baseURL = [NSURL URLWithString:@"https://www.yourWebsite.com"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL];  
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

// setup required wsapi parameters
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
[parameters setObject:username_ forKey:@"username"];
[parameters setObject:password_ forKey:@"password"];
request = [httpClient requestWithMethod:@"POST" path:@"/path/to/your/webservice/authFile.php" parameters:parameters];

// setup request headers
[request setValue:@"68489233957fd9028kd9adf40119c1c93a98c00b80h94lk2jsdo9234720" forHTTPHeaderField:@"wsapiAccessToken"];  

// setup request operation blocks
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSDictionary *dictionary = [json_ parseJSONResponse:operation.responseData];

    // do something with your response here...
    }  

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    // handle error

}];

[operation start];

在您的服务器端使用 PHP 使用类似的东西...

<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/wsapi/functions/authFunctions.php');

if(accessTokenIsValid())
{
    if((isset($_POST['username'])) && (isset($_POST['password'])))
    {
        // validate passed username and password and do whatever else you need to do.
        // be sure to respond back with something so that your app can do something 
        // useful with the response like give access to the app on success or show 
        // an error message on failure
    }
    else
    {
        $responseArray = array('authResponse'=>'__PARAMSERROR__');
        echo json_encode($responseArray);
        exit;
    }
}
else
{
    $responseArray = array('authResponse'=>'__AUTHERROR__');
    echo json_encode($responseArray);
    exit;
}

?>

请注意,我在这里使用了一个名为的函数accessTokenIsValid,如下所示。

function getWsapiAccessToken()
{
    $tokenString = "Some string here";
    // add some salt if you like - make this harder to guess
    return sha1($tokenString);
}
function accessTokenIsValid() 
{
    if( $_SERVER['HTTP_WSAPIACCESSTOKEN'] == getWsapiAccessToken() )
    {
            return true;
    }
    else
    {
            return false;
    }
}

希望这可以帮助!

于 2012-10-18T01:22:27.180 回答
1

就个人而言,我可能会构建一个身份验证服务。有了这个,用户可以使用用户/密码或您拥有的任何身份验证标准来调用身份验证服务。然后,您可以授权或拒绝用户访问 REST 服务。如果通过身份验证,您将在应用程序中将令牌传回给调用者。对主要 REST API 的后续调用将需要包含此身份验证令牌,您将在决定是否通过 REST 服务提供响应之前针对用户当前有效的令牌进行身份验证。

于 2012-10-17T20:25:06.423 回答