php - 从 JavaScript 客户端对 REST API 的授权和身份验证

标签 php javascript api rest authentication

我正在构建一个 PHP REST API,它将被 JavaScript 客户端使用,并且在弄清楚如何实现事物的身份验证和访问方面时遇到了一些问题。将有多个应用程序将使用我将开发的 JavaScript 库与我的应用程序进行对话和交互。我将为他们每个人提供 API key ,所以这不是问题。

我开始感到困惑的是如何让这些网站上的用户对我的应用程序进行身份验证。让这个外部站点存储我的用户帐户和密码信息似乎是个坏主意;所以,我想我应该让我的 JavaScript 库包含一个登录小部件,它会为我的应用程序询问用户的帐户信息。

如果验证成功,因为我正在使用 REST API,我需要将检索到的 token 存储在客户端 cookie 或其他东西中,这样用户就不需要再次登录到我的应用程序外部网站的每一页。但是,如果用户从外部站点注销,然后另一个用户从同一个浏览器登录,会发生什么情况?就我的 JavaScript 库而言,旧用户仍会登录到我的应用程序,因为 cookie/ token 尚未过期 - 当前一个用户的 session 结束时,如何清除我的 cookie?或者,我在这里完全偏离了正确的道路吗?

所以,我想这个过程会是这样的:

var token; // Some hashed string containing an expiration date and user id
var apiKey = '123abc';

// Read the cookie and check if it already contains the token
token = readCookie('token');
if (token == '') {
    // get username and password from user through some prompt

    var request_data = {apiKey: apiKey, user: username, pass: password};
    $.post('https://service.com/api/user/login', request_data, function(data) {
        token = data;
        document.cookie = "token=" + token;
    });
}

...

var get_data = {apiKey: apiKey, token: token};
$.get('http://service.com/api/<object>', get_data, function(data) {
    // Do something with data
});

抱歉,这里隐藏了几个问题。我想主要是如果我将 token 存储到 cookie 中,我如何确保在用户注销外部应用程序时清除它?或者,如果我不应该将其存储到 cookie 中,如何让客户端了解用户的状态?

最佳答案

我建议你阅读这篇 very good blog post关于保护 RESTful API。

(如果该链接不起作用 - 它已经失效一次并且必须从 archive.org 中检索 - 我发现它似乎是此页面的 PDF 渲染,可在此处访问:https://www.ida.liu.se/~TDDD97/labs/hmacarticle.pdf。)

Note: my answer is off-topic because the solution provided in the blog post above is not secure from a Javascript client. In fact, it explain mostly how to secure a REST API on the server side.

关于php - 从 JavaScript 客户端对 REST API 的授权和身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14262271/

相关文章:

javascript - 如何处理 Protractor 中的 UnexpectedAlertOpenError

javascript - 有没有办法结合 Webpack 模块来减小文件大小?

api - Instagram API错误: Client request limit reached

java - Java API中的groupingBy是什么意思,如何使用?

javascript - 使用 Loop 时,Darksky 图标不会显示

php - Laravel 在连接后计算行数

php - 简单的更新查询不起作用?

php - 在 mysql php 搜索重音字符中也突出显示搜索词

php - 我应该用 CakePHP 2 还是 3 开发

javascript - slider 在最后一张幻灯片上无法正常工作