Repository: auth0/auth0-spa-js (ts)

Issue:
Unhandled Rejection (Error): Invalid state
### Description

I am having this problem currently:

When users "Continue with Google", auth0 fails in the background with the following error
```
Uncaught (in promise) Error: Invalid state
    at t.<anonymous> (auth0-spa-js.production.js:1712)
    at auth0-spa-js.production.js:152
    at Object.next (auth0-spa-js.production.js:100)
    at auth0-spa-js.production.js:72
    at new Promise (<anonymous>)
    at i (auth0-spa-js.production.js:49)
    at t.handleRedirectCallback (auth0-spa-js.production.js:1698)
    at react-auth0-wrapper.js:27
    at l (runtime.js:45)
    at Generator._invoke (runtime.js:264)
```

My app is set up using the React Quick Start instructions with no modifications to anything auth0-related. I am using `"@auth0/auth0-spa-js": "1.3.1"`

The error only occurs when using the "Continue with Google" option. I can verify that the URL contains a `?code=nCniVKWi7AeavwQQ&state=ZjFfWU5nLkVISFhtN2RQOWF0ZENnRjZUNm00UDZpa3RHN2hCX0c1Z1V4Yw%3D%3D#` value

I read #68 and it wasn't helpful, so I've created a new ticket.

### Reproduction

1. Click "Log In"
2. "Continue with Google"
3. Upon return to the application, the error occurs in the console.
4. This happens in DEV environment (localhost) and production (a site with SSL enabled)

### Environment

> Please provide the following:

- **Version of this library used:** `"@auth0/auth0-spa-js": "1.3.1"`
- **Version of the platform or framework used, if applicable:** React Quick Start in a CreateReactApp app
- **Other relevant versions (language, server software, OS, browser):** Chrome (desktop, iOS, Android)
- **Other modules/plugins/libraries that might be involved:** n/a


Pull request description:
`parseQueryString` now removes hash fragment on query before parsing
fix #245 

Patch:
diff --git a/src/utils.ts b/src/utils.ts
index c5bc434..3518ca9 100644
--- a/src/utils.ts
+++ b/src/utils.ts
@@ -13,7 +13,12 @@ export const getUniqueScopes = (...scopes: string[]) => {
 };
 
 export const parseQueryResult = (queryString: string) => {
+  if (queryString.indexOf('#') > -1) {
+    queryString = queryString.substr(0, queryString.indexOf('#'));
+  }
+
   let queryParams = queryString.split('&');
+
   let parsedQuery: any = {};
   queryParams.forEach(qp => {
     let [key, val] = qp.split('=');


Test patch:
diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts
index c16217d..e7fdcea 100644
--- a/__tests__/utils.test.ts
+++ b/__tests__/utils.test.ts
@@ -45,6 +45,14 @@ describe('utils', () => {
         otherValue: 'another-test'
       });
     });
+    it('strips off hash values', () => {
+      expect(
+        parseQueryResult('code=some-code&state=some-state#__')
+      ).toMatchObject({
+        code: 'some-code',
+        state: 'some-state'
+      });
+    });
     it('converts `expires_in` to int', () => {
       expect(parseQueryResult('value=test&expires_in=10')).toMatchObject({
         value: 'test',