Meteor Apollo Accounts
A implementation of Meteor Accounts only in GraphQL with Apollo.
This package exposes Meteor Accounts functionality in GraphQL.
Installing
Install on Meteor server
meteor add cultofcoders:apollo-accounts
Initialize the package.
1import { makeExecutableSchema } from 'graphql-tools'; 2import { initAccounts } from 'meteor/cultofcoders:apollo-accounts'; 3import { load, getSchema } from 'graphql-load'; 4 5const { typeDefs, resolvers } = initAccounts({ 6 loginWithFacebook: false, 7 loginWithGoogle: false, 8 loginWithLinkedIn: false, 9 loginWithPhone: false, 10 loginWithPassword: true, 11 overrideCreateUser: (createUser, _, args, context) { 12 // Optionally override createUser if you need custom logic 13 // Or simply restrict him from authenticating 14 } 15}); 16 17// optional 18load({ 19 typeDefs, 20 resolvers, 21}); 22 23// Gets all the resolvers and type definitions loaded in graphql-loader 24const schema = getSchema(); 25const executableSchema = makeExecutableSchema(schema);
Install on your apollo app
May or may not be the same app.
npm install --save meteor-apollo-accounts
Examples
- janikvonrotz/meteor-apollo-accounts-example: Meteor client and server side.
- orionsoft/server-boilerplate: Large Meteor server side only starter app.
Tutorials
Methods
Meteor accounts methods, client side only. All methods are promises.
loginWithPassword
Log the user in with a password.
1import { loginWithPassword } from 'meteor-apollo-accounts'; 2 3loginWithPassword({ username, email, password }, apollo);
-
username
: Optional. The user's username. -
email
: Optional. The user's email. -
password
: The user's password. The library will hash the string before it sends it to the server. -
apollo
: Apollo client instance.
changePassword
Change the current user's password. Must be logged in.
1import { changePassword } from 'meteor-apollo-accounts'; 2 3changePassword({ oldPassword, newPassword }, apollo);
-
oldPassword
: The user's current password. This is not sent in plain text over the wire. -
newPassword
: A new password for the user. This is not sent in plain text over the wire. -
apollo
: Apollo client instance.
logout
Log the user out.
1import { logout } from 'meteor-apollo-accounts'; 2 3logout(apollo);
apollo
: Apollo client instance.
createUser
Create a new user.
1import { createUser } from 'meteor-apollo-accounts'; 2 3createUser({ username, email, password, profile }, apollo);
-
username
: A unique name for this user. -
email
: The user's email address. -
password
: The user's password. This is not sent in plain text over the wire. -
profile
: The profile object based on theUserProfileInput
input type. -
apollo
: Apollo client instance.
verifyEmail
Marks the user's email address as verified. Logs the user in afterwards.
1import { verifyEmail } from 'meteor-apollo-accounts'; 2 3verifyEmail({ token }, apollo);
-
token
: The token retrieved from the verification URL. -
apollo
: Apollo client instance.
forgotPassword
Request a forgot password email.
1import { forgotPassword } from 'meteor-apollo-accounts'; 2 3forgotPassword({ email }, apollo);
-
email
: The email address to send a password reset link. -
apollo
: Apollo client instance.
resetPassword
Reset the password for a user using a token received in email. Logs the user in afterwards.
1import { resetPassword } from 'meteor-apollo-accounts'; 2 3resetPassword({ newPassword, token }, apollo);
-
newPassword
: A new password for the user. This is not sent in plain text over the wire. -
token
: The token retrieved from the reset password URL. -
apollo
: Apollo client instance.
loginWithFacebook
Logins the user with a facebook accessToken
1import { loginWithFacebook } from 'meteor-apollo-accounts'; 2 3loginWithFacebook({ accessToken }, apollo);
-
accessToken
: A Facebook accessToken. It's recommended to use https://github.com/keppelen/react-facebook-login to fetch the accessToken. -
apollo
: Apollo client instance.
loginWithGoogle
Logins the user with a google accessToken
1import { loginWithGoogle } from 'meteor-apollo-accounts'; 2 3loginWithGoogle({ accessToken }, apollo);
-
accessToken
: A Google accessToken. It's recommended to use https://github.com/anthonyjgrove/react-google-login to fetch the accessToken. -
apollo
: Apollo client instance.
Phone support
Login support using phone number and verification code. Requires ujwal:accounts-phone package.
meteor add ujwal:accounts-phone
From your client, execute the following mutation:
mutation createUserWithPhone { createUserWithPhone (phone: "+11234567890", profile: {name: "A Phone User"}) { success } }
Server response:
1{ 2 "data": { 3 "createUserWithPhone": { 4 "success": true 5 } 6 } 7}
If Twilio has been set up on the server, a verification code will be sent to the phone via SMS.
To login with the verification code, use the following mutation:
mutation loginWithPhone { loginWithPhone (phone: "+11234567890", verificationCode: "6593") { id token tokenExpires } }
Server response:
1{ 2 "data": { 3 "loginWithPhone": { 4 "id": "eHMzRW9B685curZ63", 5 "token": "Kg9mESwmEAs6xraKZ_hPv0tzOvQpTgMPhWTNXDFCet0", 6 "tokenExpires": 1535581386595 7 } 8 } 9}
You can use the response to store the login token:
1await setTokenStore.set(id, token, new Date(tokenExpires));
To request a new verification code, use the following mutation:
mutation resendPhoneVerification { resendPhoneVerification (phone: "+11234567890") { success } }
Server response:
1{ 2 "data": { 3 "resendPhoneVerification": { 4 "success": true 5 } 6 } 7}
If Twilio has been set up, then the verification code will sent via SMS.
onTokenChange
Register a function to be called when a user is logged in or out.
1import { onTokenChange } from 'meteor-apollo-accounts'; 2 3onTokenChange(function() { 4 console.log('token did change'); 5 apollo.resetStore(); 6});
userId
Returns the id of the logged in user.
1import { userId } from 'meteor-apollo-accounts' 2 3async function () { 4 console.log('The user id is:', await userId()) 5}
React-Native usage
1//First you'll need to import the Storage library that you'll use to store the user details (userId, tokens...), 2// AsyncStorage is highly recommended. 3 4import { 5 ... 6 AsyncStorage 7} from 'react-native'; 8 9import { loginWithPassword, userId, setTokenStore} from 'meteor-apollo-accounts' 10 11// Then you'll have to define a TokenStore for your user data using setTokenStore 12// (for instance when your component is mounted): 13setTokenStore({ 14 set: async function ({userId, token, tokenExpires}) { 15 await AsyncStorage.setItem('Meteor.userId', userId) 16 await AsyncStorage.setItem('Meteor.loginToken', token) 17 // AsyncStorage doesn't support Date type so we'll store it as a String 18 await AsyncStorage.setItem('Meteor.loginTokenExpires', tokenExpires.toString()) 19 }, 20 get: async function () { 21 return { 22 userId: await AsyncStorage.getItem('Meteor.userId'), 23 token: await AsyncStorage.getItem('Meteor.loginToken'), 24 tokenExpires: await AsyncStorage.getItem('Meteor.loginTokenExpires') 25 } 26 } 27}) 28 29// Finally, you'll be able to use asynchronously any method from the library: 30async login (event) { 31 event.preventDefault(); 32 33 try { 34 const id_ = await loginWithPassword({ "email", "password" }, this.client) 35 this.client.resetStore() 36 } catch (error) { 37 38 } 39}