【问题标题】:Meteor Accounts via external services dont set user.username通过外部服务的 Meteor 帐户不设置 user.username
【发布时间】:2015-12-31 21:30:30
【问题描述】:

我是一个完全的新手,我一直在摆弄 Meteor 1.0 示例待办事项列表应用程序以将 google oauth 连接到它。

当我这样做时,页面不再正确呈现,因为根本没有设置 {{username}}

https://docs.meteor.com/#/full/meteor_users 表示“用户名:标识用户的唯一字符串”。但是 oauth 的东西不会为你创建一个。

Connect service to existing meteor account 谈到将现有帐户链接到另一个服务,但在这种情况下,我只想使用外部服务。

https://stackoverflow.com/questions/25182903/meteor-facebook-registration使用onCreateUser()手动设置

user.username = user.services.facebook.name

但这不能跨服务移植,也不能保证唯一性。

https://github.com/aldeed/meteor-collection2 定义了用户模式,因此 username 是必需的。

当我转储用户表(删除了一些字段)时,谷歌帐户没有用户名,并且没有字段可以真正自动获取该值,因为可能会发生冲突。可以使用电子邮件,但我宁愿用户名不是电子邮件地址。我是否只是强制用户指定所需的用户名?

meteor:PRIMARY> db.users.find()
{
    "_id" : "YNWt2cATMsKFG7od6",
    "createdAt" : ISODate("2014-11-05T11:08:00.406Z"),
    "services" : {
        "password" : {
        },
    },
    "username" : “a_user”
}
{
    "_id" : "CyQsJqcez3kWTRHyQ",
    "createdAt" : ISODate("2014-11-05T12:09:40.139Z"),
    "profile" : {
        "name" : “Alice User”
    },
    "services" : {
        "google" : {
            "email" : “a_user@example.com",
            "family_name" : “User”,
            "gender" : “female",
            "given_name" : "Alice”,
            "id" : "1115",
            "name" : “Alice User,
        }
    }
}

处理这个问题的正确方法是什么?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    这就是我自己使用 facebook 和 google 的方式

    Accounts.onCreateUser(function (options, user) {
        if (options && options.profile) {
            user.profile = options.profile;
    
        }
    
        if (user.services) {
    
            var service = _.pairs(user.services)[0];
    
            var serviceName = service[0];
            var serviceData = service[1];
    
            console.log("serviceName", serviceName)
    
            if (serviceName == "facebook") {
                user.emails = [
                    {"address": serviceData.email, "verified": true}
                ];
                user.profile = {"first_name": serviceData.first_name, "last_name": serviceData.last_name, "avatar": getFbPicture(serviceData.id)};
            }
            else if (serviceName == "google") {
                user.emails = [
                    {"address": serviceData.email, "verified": true}
                ];
                user.profile = {"first_name": serviceData.given_name, "last_name": serviceData.family_name, "avatar": getGooglePicture(serviceData.id)};
            }
    
        }
        console.log("user created :", user)
        return user;
    });
    

    我不使用username,但我使用电子邮件,因此我确信它是独一无二的。在那之后 我可以允许用户像 Stackoverflow 或其他服务一样设置他的 usernamedisplay name

    但是,您可以将 电子邮件 用作 username,然后再次让用户更改它。

    【讨论】:

    • 问题是如果已经存在具有相同电子邮件地址的另一个用户会发生什么?这可能会导致两个用户记录具有相同的电子邮件地址。 Meteor Docs 建议使用 Accounts.addEmail,但是由于尚未在 onCreateUser 挂钩中创建帐户,因此对 Accounts.addEmail 的调用失败。 github.com/splendido/meteor-accounts-emails-field 可能是更好的解决方案。
    • 如果您尝试使用相同的电子邮件创建 2 个帐户,它应该会失败。 github.com/meteor/meteor/blob/master/packages/accounts-base/… 抛出错误。
    【解决方案2】:

    在我的应用程序中,我使用它来处理同样的问题。

    username = user.services.facebook.name
    user.username=generateUsername(username)
    
    generateUsername = function(username) {
      var count;
      username = username.toLowerCase().trim().replace(" ", "");
      count = Meteor.users.find({"profile.un": username}).count();
      if (count === 0) {
        return username;
      } 
      else {
        return username + (count + 1)
    }
    

    这将创建一个唯一的用户名。成功注册后,您可以允许用户更改用户名并检查您的数据库是否存在。

    【讨论】:

    • 我喜欢更改用户名的想法。我没有想到这一点。我只是假设它只设置一次,但这就是 id 字段的用途。
    • 真的很方便,谢谢。不过,最后一次.toString() 调用是不必要的。 Javascript 会自动将数字转换为字符串。
    • 根据您的建议更新了 sn-p @SStanley。
    • 如何确保用户名的唯一性? username + (count + 1) 可能是现有的用户名,不是吗?
    • 谢谢,正是我所需要的,但您究竟将这段代码放在哪里?
    【解决方案3】:

    在我的应用程序中,我使用

    if(user.services.facebook)
       this.user = user.services.facebook.name
    if(user.services.google)
       this.user = user.services.google.name
    

    【讨论】:

    • 这是在 onCreateUser() 方法中吗?用户看起来将是用户上下文而不仅仅是用户名,如docs.meteor.com/#/full/accounts_oncreateuser user.username
    • 我的错,我写得很快,我的意思是user.username
    猜你喜欢
    • 2011-08-19
    • 2016-12-20
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多