diff --git a/src/Root.js b/src/Root.js
index 8d94fd9..a518f9e 100644
--- a/src/Root.js
+++ b/src/Root.js
@@ -5,6 +5,7 @@ import Icon from 'react-native-vector-icons/MaterialIcons';
 import Drawer from './components/drawer/Drawer';
 import Splash from './components/Splash';
 import Login from './components/Login';
+import LoginPage from './components/LoginPage';
 import DocumentContent from './components/app/DocumentContent';
 import DocumentView from './components/app/DocumentView';
 import Favorites from './components/app/Favorites';
@@ -17,6 +18,7 @@ const scenes = Actions.create(
   <Scene key="root" hideNavBar>
     <Scene key="splash" component={Splash} initial title="Splash" />
     <Scene key="login" component={Login} type="replace" title="Login" />
+    <Scene key="loginPage" component={LoginPage} type="replace" title="Login Page" />
     <Scene key="app" component={Drawer} type="replace">
       <Scene key="main">
         <Scene key="favorites" initial component={Favorites} title="Favorites" type="replace" />
diff --git a/src/components/Login.js b/src/components/Login.js
index 5fecc75..c9bab64 100644
--- a/src/components/Login.js
+++ b/src/components/Login.js
@@ -2,9 +2,6 @@ import React, { Component, View, TextInput, StyleSheet } from 'react-native';
 import Button from 'react-native-button';
 import { Actions } from 'react-native-router-flux';
 
-import nuxeoUtils from '../utils/nuxeo';
-import loginInfo from '../utils/loginInfo';
-
 class Login extends Component {
 
   constructor(opts) {
@@ -17,17 +14,7 @@ class Login extends Component {
   }
 
   async _connect() {
-    try {
-      const token = await nuxeoUtils.requestAuthenticationToken(this.state.serverURL,
-        this.state.username, this.state.password);
-      await loginInfo.storeLoginInfo(token, this.state.serverURL);
-
-      // create a client using token auth
-      const nuxeo = nuxeoUtils.createClient(this.state.serverURL, token);
-      Actions.app({ nuxeo });
-    } catch (e) {
-      throw e;
-    }
+    Actions.loginPage({ serverURL: this.state.serverURL });
   }
 
   render() {
@@ -41,21 +28,6 @@ class Login extends Component {
           autoFocus
           onChangeText={(serverURL) => this.setState({ serverURL })}
           value={this.state.serverURL} />
-        <TextInput
-          style={{ height: 40, borderColor: 'gray', borderWidth: 1 }}
-          placeholder="Username"
-          autoCapitalize="none"
-          autoCorrect={false}
-          onChangeText={(username) => this.setState({ username })}
-          value={this.state.username} />
-        <TextInput
-          style={{ height: 40, borderColor: 'gray', borderWidth: 1 }}
-          placeholder="Password"
-          secureTextEntry
-          autoCapitalize="none"
-          autoCorrect={false}
-          onChangeText={(password) => this.setState({ password })}
-          value={this.state.password} />
         <Button
           style={{ fontSize: 20 }}
           styleDisabled={{ color: 'red' }}
diff --git a/src/components/LoginPage.js b/src/components/LoginPage.js
new file mode 100644
index 0000000..6472c84
--- /dev/null
+++ b/src/components/LoginPage.js
@@ -0,0 +1,62 @@
+import React, { Component, Dimensions, StyleSheet, WebView } from 'react-native';
+import { Actions } from 'react-native-router-flux';
+import CookieManager from 'react-native-cookies';
+import DeviceInfo from 'react-native-device-info';
+
+import nuxeoUtils from '../utils/nuxeo';
+import loginInfo from '../utils/loginInfo';
+
+const DEVICE_HEIGHT = Dimensions.get('window').height;
+
+class LoginPage extends Component {
+
+  constructor(opts) {
+    super(opts);
+
+    this._onNavigationStateChange = this._onNavigationStateChange.bind(this);
+  }
+
+  async _onNavigationStateChange(navState) {
+    if (navState.url.indexOf('#token=') !== -1) {
+      try {
+        const match = navState.url.match(/^.*#token=(.*)$/);
+        const token = match[1];
+        await loginInfo.storeLoginInfo(token, this.props.serverURL);
+        CookieManager.clearAll(() => {
+          const nuxeo = nuxeoUtils.createClient(this.props.serverURL, token);
+          Actions.app({ nuxeo });
+        });
+      } catch (e) {
+        throw e;
+      }
+    }
+  }
+
+  render() {
+    const url = `${this.props.serverURL}/acquire_token.jsp?applicationName=Nuxeo Mobile`
+      + `&deviceId=${DeviceInfo.getUniqueID()}&deviceDescription=${DeviceInfo.getDeviceName()}&permission=rw`;
+    return (
+      <WebView
+        automaticallyAdjustContentInsets
+        style={styles.webView}
+        source={{ uri: url }}
+        javaScriptEnabled
+        decelerationRate="normal"
+        onNavigationStateChange={this._onNavigationStateChange}
+        startInLoadingState />
+    );
+  }
+}
+
+LoginPage.propTypes = {
+  serverURL: React.PropTypes.string.isrequired,
+};
+
+
+const styles = StyleSheet.create({
+  webview: {
+    height: DEVICE_HEIGHT,
+  },
+});
+
+export default LoginPage;
diff --git a/src/utils/nuxeo.js b/src/utils/nuxeo.js
index d37668c..0bbdf02 100644
--- a/src/utils/nuxeo.js
+++ b/src/utils/nuxeo.js
@@ -1,27 +1,6 @@
-import DeviceInfo from 'react-native-device-info';
-
 import Nuxeo from 'nuxeo';
 
 export default {
-  async requestAuthenticationToken(baseURL, username, password) {
-    const nuxeo = new Nuxeo({
-      baseURL,
-      auth: {
-        username,
-        password,
-        method: 'basic',
-      },
-    });
-    try {
-      await nuxeo.login();
-      const token = await nuxeo.requestAuthenticationToken('Nuxeo Mobile', DeviceInfo.getUniqueID(),
-        DeviceInfo.getDeviceName(), 'rw');
-      return token;
-    } catch (e) {
-      throw e;
-    }
-  },
-
   createClient(baseURL, token) {
     return new Nuxeo({
       baseURL,
