Hi everyone. I’ve been tasked with implementing Meteor.loginWith<externalService>
. Unfortunately, I’ve looked all over for ways of “unlinking” a Meteor.user
from their external service.
Now, in our service, we would like it if people eventually made standalone accounts with us. In order to implement this fully, I need a way of unlinking (and re-linking) users from external services which they used to sign up with. So I came up with a solution, but I would like feedback on the efficacy of this solution. If there’s a better way, I want to know about it.
Desired Effect
- User logs in with twitter via
Meteor.loginWithTwitter
. - User goes to settings page and sees this:
- User adds an email and password through method calls utilizing
Accounts.addEmail
andAccounts.setPassword
. - Clicking unlink should keep the user logged in (with the email and password they set up earlier), but their
Meteor.user
gets theservices.twitter
removed (i.e. they get unlinked from Twitter).
Solution:
- When the user clicks “unlink”, we prompt them for their password.
- First, we log the user in (without logging them out of the external service) using their email and the password they just entered.
- Next, we call a method which removed
services.twitter
from theirMeteor.user
.
/*Do not use this code without proper error/security checks*/
//this is in a React component
_onUnlinkTwitterClick(){
this.setState({passwordPrompt: true})
}
_onPasswordPromptFormSubmit(){
const email = this.props.user.emails[0].address;
Meteor.loginWithPassword(email, this.state.enteredPassword, (err)=>{
if (err){return};
Meteor.call('unlinkTwitter')
}
}
//server
Meteor.methods({
unlinkTwitter: function(){
Meteor.users.update(this.userId,{$unset:{'services.twitter':true}})
}
})
So, this is pretty simple and I don’t see why there wouldn’t be a package or built-in function for this. I haven’t checked Atmosphere, yet. If there’s a simpler way to do this (i.e. with built-in Meteor
/Accounts
methods), please do share. Thanks.