From d95bfc99a671ea8e2ef4e9767a9235791b5f33b1 Mon Sep 17 00:00:00 2001 From: "Guillaume \"B.B.\" Van Hemmen" Date: Tue, 14 May 2024 13:43:07 +0200 Subject: [PATCH] add sso --- .gitignore | 6 ++ app/(tabs)/_layout.tsx | 59 ------------- app/(tabs)/index.tsx | 31 ------- app/(tabs)/two.tsx | 31 ------- app/_layout.tsx | 83 ++++++++++-------- app/index.tsx | 193 +++++++++++++++++++++++++++++++++++++++++ app/ssoCallback.tsx | 9 ++ app/ssoLogout.tsx | 9 ++ package-lock.json | 33 +++++++ package.json | 3 +- 10 files changed, 300 insertions(+), 157 deletions(-) delete mode 100644 app/(tabs)/_layout.tsx delete mode 100644 app/(tabs)/index.tsx delete mode 100644 app/(tabs)/two.tsx create mode 100644 app/index.tsx create mode 100644 app/ssoCallback.tsx create mode 100644 app/ssoLogout.tsx diff --git a/.gitignore b/.gitignore index 05647d5..0b37b6e 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,9 @@ yarn-error.* # typescript *.tsbuildinfo + +# @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb +# The following patterns were generated by expo-cli + +expo-env.d.ts +# @end expo-cli \ No newline at end of file diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx deleted file mode 100644 index 30914fb..0000000 --- a/app/(tabs)/_layout.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import FontAwesome from '@expo/vector-icons/FontAwesome'; -import { Link, Tabs } from 'expo-router'; -import { Pressable } from 'react-native'; - -import Colors from '@/constants/Colors'; -import { useColorScheme } from '@/components/useColorScheme'; -import { useClientOnlyValue } from '@/components/useClientOnlyValue'; - -// You can explore the built-in icon families and icons on the web at https://icons.expo.fyi/ -function TabBarIcon(props: { - name: React.ComponentProps['name']; - color: string; -}) { - return ; -} - -export default function TabLayout() { - const colorScheme = useColorScheme(); - - return ( - - , - headerRight: () => ( - - - {({ pressed }) => ( - - )} - - - ), - }} - /> - , - }} - /> - - ); -} diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx deleted file mode 100644 index 6cbee6d..0000000 --- a/app/(tabs)/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { StyleSheet } from 'react-native'; - -import EditScreenInfo from '@/components/EditScreenInfo'; -import { Text, View } from '@/components/Themed'; - -export default function TabOneScreen() { - return ( - - Tab One - - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - title: { - fontSize: 20, - fontWeight: 'bold', - }, - separator: { - marginVertical: 30, - height: 1, - width: '80%', - }, -}); diff --git a/app/(tabs)/two.tsx b/app/(tabs)/two.tsx deleted file mode 100644 index f2ea47e..0000000 --- a/app/(tabs)/two.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { StyleSheet } from 'react-native'; - -import EditScreenInfo from '@/components/EditScreenInfo'; -import { Text, View } from '@/components/Themed'; - -export default function TabTwoScreen() { - return ( - - Tab Two - - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }, - title: { - fontSize: 20, - fontWeight: 'bold', - }, - separator: { - marginVertical: 30, - height: 1, - width: '80%', - }, -}); diff --git a/app/_layout.tsx b/app/_layout.tsx index fa77b73..061c643 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,58 +1,71 @@ import FontAwesome from '@expo/vector-icons/FontAwesome'; -import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'; -import { useFonts } from 'expo-font'; -import { Stack } from 'expo-router'; +import {DarkTheme, DefaultTheme, ThemeProvider} from '@react-navigation/native'; +import {useFonts} from 'expo-font'; +import {Stack} from 'expo-router'; import * as SplashScreen from 'expo-splash-screen'; -import { useEffect } from 'react'; +import {useEffect} from 'react'; -import { useColorScheme } from '@/components/useColorScheme'; +import {useColorScheme} from '@/components/useColorScheme'; +import {View} from "react-native"; export { - // Catch any errors thrown by the Layout component. - ErrorBoundary, + // Catch any errors thrown by the Layout component. + ErrorBoundary, } from 'expo-router'; export const unstable_settings = { - // Ensure that reloading on `/modal` keeps a back button present. - initialRouteName: '(tabs)', + // Ensure that reloading on `/modal` keeps a back button present. + initialRouteName: '(tabs)', }; // Prevent the splash screen from auto-hiding before asset loading is complete. SplashScreen.preventAutoHideAsync(); export default function RootLayout() { - const [loaded, error] = useFonts({ - SpaceMono: require('../assets/fonts/SpaceMono-Regular.ttf'), - ...FontAwesome.font, - }); + const [loaded, error] = useFonts({ + SpaceMono: require('../assets/fonts/SpaceMono-Regular.ttf'), + ...FontAwesome.font, + }); - // Expo Router uses Error Boundaries to catch errors in the navigation tree. - useEffect(() => { - if (error) throw error; - }, [error]); + // Expo Router uses Error Boundaries to catch errors in the navigation tree. + useEffect(() => { + if (error) throw error; + }, [error]); - useEffect(() => { - if (loaded) { - SplashScreen.hideAsync(); + useEffect(() => { + if (loaded) { + SplashScreen.hideAsync(); + } + }, [loaded]); + + if (!loaded) { + return null; } - }, [loaded]); - if (!loaded) { - return null; - } - - return ; + return ; } function RootLayoutNav() { - const colorScheme = useColorScheme(); + const colorScheme = useColorScheme(); - return ( - - - - - - - ); + return ( + + + + + + + + + + + + ); } diff --git a/app/index.tsx b/app/index.tsx new file mode 100644 index 0000000..b08a801 --- /dev/null +++ b/app/index.tsx @@ -0,0 +1,193 @@ +import * as AuthSession from 'expo-auth-session'; +import {TokenResponse} from 'expo-auth-session'; +import * as WebBrowser from 'expo-web-browser'; +import React, {useEffect, useState} from 'react'; +import {Button, Text, View} from "react-native"; + +WebBrowser.maybeCompleteAuthSession(); +// const redirectURI = AuthSession.makeRedirectUri({native: 'http://127.0.0.1:8082/ssoCallback', // TODO: why is it translated to localhost? Why /ssoCallback is missing?}); +const redirectURI = 'https://poc-sso-marn.van-hemmen.com/ssoCallback'; + +console.log(redirectURI); + +export default function indexScreen() { + const [tokenResponse, setTokenResponse] = useState(null); + + // const discovery = AuthSession.useAutoDiscovery('https://fes509-integ.m-team.be/login/oauth2/realms/root/realms/509'); + const discovery: AuthSession.DiscoveryDocument = { + tokenEndpoint: 'https://fes509-integ.m-team.be:443/login/oauth2/access_token', + revocationEndpoint: 'https://fes509-integ.m-team.be:443/login/oauth2/token/revoke', + endSessionEndpoint: 'https://fes509-integ.m-team.be:443/login/oauth2/connect/endSession', + authorizationEndpoint: 'https://fes509-integ.m-team.be:443/login/oauth2/authorize', + userInfoEndpoint: 'https://fes509-integ.m-team.be:443/login/oauth2/userinfo', + registrationEndpoint: 'https://fes509-integ.m-team.be:443/login/oauth2/register', + discoveryDocument: { + "request_parameter_supported": true, + "pushed_authorization_request_endpoint": "https://fes509-integ.m-team.be:443/login/oauth2/par", + "introspection_encryption_alg_values_supported": ["RSA-OAEP-256", "ECDH-ES+A256KW", "A128KW", "A192KW", "RSA-OAEP", "ECDH-ES+A192KW", "A256KW", "ECDH-ES", "ECDH-ES+A128KW", "dir"], + "claims_parameter_supported": false, + "introspection_endpoint": "https://fes509-integ.m-team.be:443/login/oauth2/introspect", + "issuer": "https://fes509-integ.m-team.be:443/login/oauth2", + "id_token_encryption_enc_values_supported": ["A256GCM", "A128GCM", "A256CBC-HS512", "A128CBC-HS256", "A192CBC-HS384", "A192GCM"], + "userinfo_encryption_enc_values_supported": ["A256GCM", "A128CBC-HS256", "A192CBC-HS384", "A192GCM", "A128GCM", "A256CBC-HS512"], + "authorization_endpoint": "https://fes509-integ.m-team.be:443/login/oauth2/authorize", + "authorization_encryption_alg_values_supported": ["ECDH-ES+A256KW", "ECDH-ES", "A256KW", "RSA-OAEP", "A128KW", "RSA-OAEP-256", "A192KW", "ECDH-ES+A192KW", "dir", "ECDH-ES+A128KW"], + "introspection_encryption_enc_values_supported": ["A128CBC-HS256", "A192CBC-HS384", "A256GCM", "A256CBC-HS512", "A128GCM", "A192GCM"], + "claims_supported": [], + "rcs_request_signing_alg_values_supported": ["RS512", "PS384", "PS256", "HS256", "HS384", "ES512", "RS256", "RS384", "HS512", "ES384", "ES256", "PS512"], + "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "self_signed_tls_client_auth", "tls_client_auth", "none", "client_secret_basic"], + "tls_client_certificate_bound_access_tokens": true, + "response_modes_supported": ["query", "fragment.jwt", "form_post", "form_post.jwt", "jwt", "fragment", "query.jwt"], + "backchannel_logout_session_supported": true, + "token_endpoint": "https://fes509-integ.m-team.be:443/login/oauth2/access_token", + "response_types_supported": ["code token id_token", "code", "code id_token", "id_token", "code token", "token", "token id_token"], + "authorization_encryption_enc_values_supported": ["A192CBC-HS384", "A256CBC-HS512", "A128CBC-HS256", "A256GCM", "A192GCM", "A128GCM"], + "revocation_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "self_signed_tls_client_auth", "tls_client_auth", "none", "client_secret_basic"], + "request_uri_parameter_supported": true, + "grant_types_supported": ["implicit", "urn:ietf:params:oauth:grant-type:saml2-bearer", "refresh_token", "password", "client_credentials", "urn:ietf:params:oauth:grant-type:device_code", "authorization_code", "urn:openid:params:grant-type:ciba", "urn:ietf:params:oauth:grant-type:uma-ticket", "urn:ietf:params:oauth:grant-type:token-exchange", "urn:ietf:params:oauth:grant-type:jwt-bearer"], + "version": "3.0", + "userinfo_endpoint": "https://fes509-integ.m-team.be:443/login/oauth2/userinfo", + "require_request_uri_registration": true, + "code_challenge_methods_supported": ["plain", "S256"], + "id_token_encryption_alg_values_supported": ["A128KW", "A192KW", "ECDH-ES+A256KW", "RSA-OAEP-256", "RSA-OAEP", "A256KW", "ECDH-ES+A128KW", "ECDH-ES+A192KW", "ECDH-ES", "dir"], + "authorization_signing_alg_values_supported": ["PS256", "ES256", "RS512", "ES384", "RS384", "HS256", "PS512", "ES512", "RS256", "HS384", "HS512", "PS384", "EdDSA"], + "request_object_signing_alg_values_supported": ["RS256", "ES512", "PS512", "RS384", "HS512", "ES256", "ES384", "HS256", "HS384", "PS384", "RS512", "PS256"], + "request_object_encryption_alg_values_supported": ["RSA-OAEP-256", "ECDH-ES", "ECDH-ES+A192KW", "ECDH-ES+A128KW", "A256KW", "RSA-OAEP", "dir", "A128KW", "ECDH-ES+A256KW", "A192KW"], + "rcs_response_signing_alg_values_supported": ["PS256", "ES384", "RS512", "ES256", "HS512", "PS384", "RS256", "ES512", "PS512", "HS384", "HS256", "RS384"], + "introspection_signing_alg_values_supported": ["ES384", "PS384", "ES256", "PS256", "PS512", "EdDSA", "HS512", "RS384", "RS256", "RS512", "HS256", "ES512", "HS384"], + "check_session_iframe": "https://fes509-integ.m-team.be:443/login/oauth2/connect/checkSession", + "scopes_supported": [], + "backchannel_logout_supported": true, + "acr_values_supported": ["itsmeAffiliation", "eid", "impersonate", "impersonateNew", "usernamePassword", "itsme", "fasCitizenLevel400", "biometric"], + "request_object_encryption_enc_values_supported": ["A128GCM", "A256GCM", "A192CBC-HS384", "A256CBC-HS512", "A128CBC-HS256", "A192GCM"], + "rcs_request_encryption_alg_values_supported": ["dir", "A192KW", "RSA-OAEP-256", "ECDH-ES+A256KW", "RSA-OAEP", "ECDH-ES", "A256KW", "A128KW", "ECDH-ES+A128KW", "ECDH-ES+A192KW"], + "userinfo_signing_alg_values_supported": ["ES256", "HS512", "ES512", "HS384", "RS256", "ES384", "HS256"], + "require_pushed_authorization_requests": false, + "rcs_response_encryption_enc_values_supported": ["A256CBC-HS512", "A192CBC-HS384", "A256GCM", "A128GCM", "A192GCM", "A128CBC-HS256"], + "userinfo_encryption_alg_values_supported": ["RSA-OAEP", "dir", "A256KW", "ECDH-ES+A256KW", "ECDH-ES", "RSA-OAEP-256", "A128KW", "ECDH-ES+A192KW", "A192KW", "ECDH-ES+A128KW"], + "end_session_endpoint": "https://fes509-integ.m-team.be:443/login/oauth2/connect/endSession", + "rcs_request_encryption_enc_values_supported": ["A256GCM", "A256CBC-HS512", "A192GCM", "A128CBC-HS256", "A128GCM", "A192CBC-HS384"], + "revocation_endpoint": "https://fes509-integ.m-team.be:443/login/oauth2/token/revoke", + "rcs_response_encryption_alg_values_supported": ["ECDH-ES+A256KW", "dir", "A256KW", "ECDH-ES+A192KW", "RSA-OAEP-256", "ECDH-ES", "ECDH-ES+A128KW", "A128KW", "A192KW", "RSA-OAEP"], + "token_endpoint_auth_signing_alg_values_supported": ["RS512", "RS384", "RS256", "ES512", "HS256", "HS384", "PS512", "ES384", "PS256", "ES256", "HS512", "PS384"], + "jwks_uri": "https://fes509-integ.m-team.be:443/login/oauth2/connect/jwk_uri", + "subject_types_supported": ["public", "pairwise"], + "id_token_signing_alg_values_supported": ["RS384", "RS256", "PS512", "ES512", "HS384", "HS256", "PS256", "ES256", "PS384", "ES384", "RS512", "HS512"], + "registration_endpoint": "https://fes509-integ.m-team.be:443/login/oauth2/register" + } + }; + const [request, result, promptAsync] = AuthSession.useAuthRequest( + { + clientId: '509-marn-app', + redirectUri: redirectURI, + usePKCE: true, + }, + discovery, + ); + + useEffect(() => { + console.log('result'); + console.log(result); + }, [result]); + + useEffect(() => { + console.log('request'); + console.log(request); + request?.makeAuthUrlAsync(discovery!).then(value => console.log(value)); + }, [request]); + + useEffect(() => { + console.log('tokenResponse'); + console.log(tokenResponse); + }, [tokenResponse]); + + return ( + + HOME PAGE + +