Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
React Native Trick: Get Cookies of WebView without using any native modules such as react-native-cookies. Might be helpful for getting JWT while making OAuth2 👽
// @flow
import React, { Component } from 'react';
import {
WebView,
} from 'react-native';
class LoginScreen extends Component {
state = {
cookies : {},
webViewUrl : ''
}
onNavigationStateChange = (webViewState: { url: string }) => {
const { url } = webViewState;
// when WebView.onMessage called, there is not-http(s) url
if(url.includes('http')) {
this.setState({ webViewUrl: url })
}
}
_checkNeededCookies = () => {
const { cookies, webViewUrl } = this.state;
if (webViewUrl === 'SUCCESS_URL') {
if (cookies['cookie-name-for-jwt']) {
alert(cookies['cookie-name-for-jwt']);
// do your magic...
}
}
}
_onMessage = (event) => {
const { data } = event.nativeEvent;
const cookies = data.split(';'); // `csrftoken=...; rur=...; mid=...; somethingelse=...`
cookies.forEach((cookie) => {
const c = cookie.trim().split('=');
const new_cookies = this.state.cookies;
new_cookies[c[0]] = c[1];
this.setState({ cookies: new_cookies });
});
this._checkNeededCookies();
}
render() {
const jsCode = "window.postMessage(document.cookie)"
// let jsCode = "window.postMessage(document.cookie= 'login=; expires=Bla bla bla')"; // if you need to write some cookies, not sure if it goes to shared cookies, most probably no :)
return (
<WebView
source={{ uri: 'AUTH_URL' }}
onNavigationStateChange={this.onNavigationStateChange}
onMessage={this._onMessage}
injectedJavaScript={jsCode}
style={{ flex: 1 }}
/>
);
}
}
export default LoginScreen;
@srinivasdamam

This comment has been minimized.

Copy link

srinivasdamam commented Sep 7, 2017

Hey this is not working, when the message is posted the webView stops loading the page, I have crossed checked everything but still this doesn't work.

@nick-castaneda

This comment has been minimized.

Copy link

nick-castaneda commented Oct 19, 2017

The injection happens after page load. Maybe try programmatically changing the webview url. That worked for me.

@miguelnfuertesc

This comment has been minimized.

Copy link

miguelnfuertesc commented Mar 13, 2019

Good trick! Thank you for sharing it.

@juanmicl

This comment has been minimized.

Copy link

juanmicl commented Aug 15, 2019

Nice trick, but we can't read HttpsOnly cookies :(

@ivanferrer

This comment has been minimized.

Copy link

ivanferrer commented Sep 18, 2019

Same is security if use postMessage...

@ramisalem

This comment has been minimized.

Copy link

ramisalem commented Dec 11, 2019

where did you pass the cookies to the URL ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.