有很多方法可以给这只猫换肤,但假设您的 Chrome 扩展程序需要登录名和密码才能连接到服务器端点(即用户已经在服务器端注册了您的应用程序),一种支持跟随“登录”api 返回一个临时令牌(它可能有一个过期),然后在所有其他书签 api 的“授权”标头中发送这个令牌。
所以用 curl 术语来说:
1) 您的 chrome 扩展首先“登录”用户:
curl -u <user login id>:<user password> https://my-bookmark.com/api/v1/login
注意在这种情况下,用户的登录名和密码通过 https(安全)行发送 base-64 编码,并且需要验证用户。它使用“Basic-Auth”机制通过“Authorization”标头发送它。
如果成功,您将返回一个 200 响应,其中包含一个包含临时令牌和一些过期时间(以秒为单位)的 json 有效负载 - 例如:
{
user_id: 12345, // Some unique user id
session_token: "azxvehft......." // some long base-64 encoded value
expires_in : 28800 // number of seconds the token is valid - say 8 hours
// Any other useful user profile or metadata
.
.
}
关键是如何在服务器端生成令牌。例如,您可以这样做:
session_token = base64_encode(aes_encrypt(some_secret_key, user_login_time))
这个想法是,在随后的 API 调用中,您将在“授权”标头中传递令牌,您可以使用相同的密钥对其进行解密,并将“登录时间戳”与用户数据进行比较。
您可以只跟踪一些临时存储中的令牌以直接比较它,但它必须是加密强的伪随机数生成器。
您也可以使用用户的单向密码哈希作为上述加密的密钥。
2) 将步骤 1 中的令牌用于某个书签 api
curl -H "Authorization: MyBookmark <user_id>:<session_token>" https://my-bookmark.com/api/v1/list
这里我假设有一个“列表”api,并且您正在检索属于用户的书签列表 (HTTP GET)。
可以看出,此处的 GET 调用包含带有自定义身份验证方案的“授权”标头(此处声明为“MyBookmark”),并且您正在传递用户 ID 和从登录 API 接收的令牌回应。
在处理此请求之前,服务器必须以某种方式验证给定用户 ID 的令牌,如前所述。由于它是使用密钥的加密令牌,因此任何篡改令牌的尝试都可能导致解密步骤失败,这可能会被检测到。
您可以使用给定的过期时间缓存令牌,一旦过期,强制用户重新登录。
此外,如果您可以让用户选择保存他们的密码(可能是不可取的),以避免通过在新令牌过期后静默获取新令牌来避免重新登录。
希望这会有所帮助。