3

在 OAuth2 令牌交换结束时,我 [通常] 留下一个 JSON 用户数据数组,我已将其解组为一个结构(例如,GoogleUser),其中包含我关心的字段。

将该数据记录到我的数据库的明智方法是什么?只需CreateUser从回调处理程序调用一个函数,传递结构并保存它(对我来说很明显),在检查用户在数据库中不存在之后?

我假设我应该在回调处理程序中创建一个会话令牌(即session.Values["authenticated"] == true),将其存储在一个 cookie 中(具有合理的到期日期),然后只需检查if authenticated == true任何需要登录用户的处理程序函数?或者,对于管理员处理程序:if admin_user == true. 假设我通过 HTTPS 交谈并使用安全 cookie,这里有什么风险(如果有的话) ?

为基本问题道歉:只是试图掌握使用 OAuth 登录用户的“最佳实践”方法。

4

2 回答 2

1

关于您的第一个问题,通常建议在单个事务中进行检查并插入。这取决于您使用的数据库,但这些通常称为UPSERT语句。在 PLSQL 中,它看起来有点像这样(根据口味修改):

CREATE FUNCTION upsert_user(emailv character varying, saltv character varying, hashv character varying, date_createdv timestamp without time zone) RETURNS void
    LANGUAGE plpgsql
AS $$;
BEGIN
    LOOP
        -- first try to update the key
        UPDATE users SET (salt, hash) = (saltv, hashv) WHERE email = emailv;
        IF found THEN
            RETURN;
        END IF;
        -- not there, so try to insert the key
        -- if someone else inserts the same key concurrently,
        -- we could get a unique-key failure
        BEGIN
            INSERT INTO users(email, salt, hash, date_created) VALUES (emailv, saltv, hashv, date_createdv);
            RETURN;
        EXCEPTION WHEN unique_violation THEN
            -- do nothing, and loop to try the UPDATE again
        END;
    END LOOP;
END;
$$;

关于您的第二个问题,通常 Secure通过 HTTPS 的 cookie 就足够了。我会设置HttpOnly选项,通常也会设置选项Path

HttpOnly表示 cookie 不能被 JS 访问(只有 HTTP 或 HTTPS),并且该Path选项允许您指定 cookie 有效的路径(在 URL 中)。

于 2013-05-21T14:55:14.443 回答
1

在标准Access TokenOAuth一个期限。它通常由授权服务器确定。在您的情况下,我假设您在授权服务器端。

例如阅读RFC 6750 :

通常,不记名令牌作为 OAuth 2.0 [RFC6749] 访问令牌响应的一部分返回给客户端。这种响应的一个例子是:

 HTTP/1.1 200 OK
 Content-Type: application/json;charset=UTF-8
 Cache-Control: no-store
 Pragma: no-cache

 {
   "access_token":"mF_9.B5f-4.1JqM",
   "token_type":"Bearer",
   "expires_in":3600,
   "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA"
 }

另请阅读RFC 6749Access Token中的概念:

访问令牌提供了一个抽象层,用资源服务器可以理解的单个令牌替换不同的授权结构(例如,用户名和密码)。这种抽象使得发布访问令牌比用于获取它们的授权授予更具限制性,并且消除了资源服务器对理解各种身份验证方法的需要。

因此,在您的情况下,我认为不需要“cookie”或“管理员处理程序”。您只需要像规范所说的那样为每个登录的用户生成Access Token& ,并存储它的到期时间。您还可以提供与相关的哈希方法,以确保它是合法请求。例如,用户使用他们的访问令牌通过哈希和盐方法生成签名,将访问令牌和签名发送到服务器进行验证。阅读公钥加密了解更多详情。Refresh TokenOAuthAccess Token

此外,您不需要将这些令牌保存到您的数据库中,因为它们都是临时资源。您还可以将所有用户信息保存在内存中并实现缓存层以将这些真正重要的信息定期保存到数据库中(我目前正在使用)以降低数据库压力。

于 2013-05-21T03:45:39.700 回答