在 OAuth2 token 交换结束时,我 [通常] 留下一个 JSON 用户数据数组,我已将这些数据解编为一个结构(例如,GoogleUser),其中包含我关心的字段。
将该数据记录到我的数据库的明智方法是什么?只需从回调处理程序调用 CreateUser
函数,传递结构并保存它(对我来说是显而易见的方法),在检查用户是否已经存在于数据库中之后?
我假设我应该在回调处理程序中创建一个 session token (即 session.Values["authenticated"] == true
),将其存储在 cookie 中(具有合理的到期日期)并简单地在任何需要登录用户的处理函数上检查 if authenticated == true
?或者,对于管理员处理程序:if admin_user == true
。 这里有什么风险(如果有的话)假设我正在通过 HTTPS 交谈并使用安全 cookie?
对基本问题表示歉意:只是想掌握“最佳实践”方法,以使用 OAuth 登录用户。
最佳答案
关于您的第一个问题,通常建议在单个事务中进行检查和插入。这取决于您使用的是什么数据库,但这些通常称为 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
cookies 通过 HTTPS 就足够了。我会设置 HttpOnly
选项,通常还会设置 Path
选项。
HttpOnly
表示cookie不能被JS访问(只能HTTP或者HTTPS),Path
选项可以指定什么路径(在URL中) cookie 的有效期为。
关于session - 处理 OAuth 响应和 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16635644/