[NEW] Support Google OAuth from external browser (#3134)
* Deep linking to the app * Handle deep linking
This commit is contained in:
parent
b2c60e7b53
commit
7e31ac75f1
|
@ -1,6 +1,6 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {
|
import {
|
||||||
View, StyleSheet, Text, Animated, Easing
|
View, StyleSheet, Text, Animated, Easing, Linking
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
@ -24,6 +24,9 @@ const SERVICE_HEIGHT = 58;
|
||||||
const BORDER_RADIUS = 2;
|
const BORDER_RADIUS = 2;
|
||||||
const SERVICES_COLLAPSED_HEIGHT = 174;
|
const SERVICES_COLLAPSED_HEIGHT = 174;
|
||||||
|
|
||||||
|
const LOGIN_STYPE_POPUP = 'popup';
|
||||||
|
const LOGIN_STYPE_REDIRECT = 'redirect';
|
||||||
|
|
||||||
const styles = StyleSheet.create({
|
const styles = StyleSheet.create({
|
||||||
serviceButton: {
|
serviceButton: {
|
||||||
borderRadius: BORDER_RADIUS,
|
borderRadius: BORDER_RADIUS,
|
||||||
|
@ -122,9 +125,9 @@ class LoginServices extends React.PureComponent {
|
||||||
const endpoint = 'https://accounts.google.com/o/oauth2/auth';
|
const endpoint = 'https://accounts.google.com/o/oauth2/auth';
|
||||||
const redirect_uri = `${ server }/_oauth/google?close`;
|
const redirect_uri = `${ server }/_oauth/google?close`;
|
||||||
const scope = 'email';
|
const scope = 'email';
|
||||||
const state = this.getOAuthState();
|
const state = this.getOAuthState(LOGIN_STYPE_REDIRECT);
|
||||||
const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`;
|
const params = `?client_id=${ clientId }&redirect_uri=${ redirect_uri }&scope=${ scope }&state=${ state }&response_type=code`;
|
||||||
this.openOAuth({ url: `${ endpoint }${ params }` });
|
Linking.openURL(`${ endpoint }${ params }`);
|
||||||
}
|
}
|
||||||
|
|
||||||
onPressLinkedin = () => {
|
onPressLinkedin = () => {
|
||||||
|
@ -219,9 +222,16 @@ class LoginServices extends React.PureComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getOAuthState = () => {
|
getOAuthState = (loginStyle = LOGIN_STYPE_POPUP) => {
|
||||||
const credentialToken = random(43);
|
const credentialToken = random(43);
|
||||||
return Base64.encodeURI(JSON.stringify({ loginStyle: 'popup', credentialToken, isCordova: true }));
|
let obj = { loginStyle, credentialToken, isCordova: true };
|
||||||
|
if (loginStyle === LOGIN_STYPE_REDIRECT) {
|
||||||
|
obj = {
|
||||||
|
...obj,
|
||||||
|
redirectUrl: 'rocketchat://auth'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return Base64.encodeURI(JSON.stringify(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
openOAuth = ({ url, ssoToken, authType = 'oauth' }) => {
|
openOAuth = ({ url, ssoToken, authType = 'oauth' }) => {
|
||||||
|
|
|
@ -16,6 +16,7 @@ import {
|
||||||
import { localAuthenticate } from '../utils/localAuthentication';
|
import { localAuthenticate } from '../utils/localAuthentication';
|
||||||
import { goRoom } from '../utils/goRoom';
|
import { goRoom } from '../utils/goRoom';
|
||||||
import { loginRequest } from '../actions/login';
|
import { loginRequest } from '../actions/login';
|
||||||
|
import log from '../utils/log';
|
||||||
|
|
||||||
const roomTypes = {
|
const roomTypes = {
|
||||||
channel: 'c', direct: 'd', group: 'p', channels: 'l'
|
channel: 'c', direct: 'd', group: 'p', channels: 'l'
|
||||||
|
@ -93,6 +94,15 @@ const fallbackNavigation = function* fallbackNavigation() {
|
||||||
yield put(appInit());
|
yield put(appInit());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleOAuth = function* handleOAuth({ params }) {
|
||||||
|
const { credentialToken, credentialSecret } = params;
|
||||||
|
try {
|
||||||
|
yield RocketChat.loginOAuthOrSso({ oauth: { credentialToken, credentialSecret } });
|
||||||
|
} catch (e) {
|
||||||
|
log(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleOpen = function* handleOpen({ params }) {
|
const handleOpen = function* handleOpen({ params }) {
|
||||||
const serversDB = database.servers;
|
const serversDB = database.servers;
|
||||||
const serversCollection = serversDB.get('servers');
|
const serversCollection = serversDB.get('servers');
|
||||||
|
@ -108,6 +118,11 @@ const handleOpen = function* handleOpen({ params }) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (params.type === 'oauth') {
|
||||||
|
yield handleOAuth({ params });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// If there's no host on the deep link params and the app is opened, just call appInit()
|
// If there's no host on the deep link params and the app is opened, just call appInit()
|
||||||
if (!host) {
|
if (!host) {
|
||||||
yield fallbackNavigation();
|
yield fallbackNavigation();
|
||||||
|
|
Loading…
Reference in New Issue