Като мобилен разработчик на определен етап ще трябва да приложите OAuth 2 стратегия, като използвате социални медии или други средства.
Тази статия няма да обяснява какво е Oauth 2 или как работи, тъй като има изобилие от статии онлайн по този въпрос.
Въпросът е трябва ли да използвам Oauth 2 на клиента или на сървъра?
Клиентска страна
Има няколко пакета като:
react-native-oauth, вижте хранилището тук.
react-native-simple-auth вижте хранилището тук.
Опитах някои от тези пакети, където има минуси и плюсове
Професионалисти :
- Това е пакет с отворен код.
- Има много примери за изпълнение.
- Лесен за внедряване (не всички пакети).
Минуси:
- Поддръжка на пакета.
- Допълнителна конфигурация за URI за пренасочване.
- Без клиентски контрол.
- Няма достъп до върнатите данни от обратно извикване на OAuth 2 директно от сървъра.
Сървърна страна
Внедряването на сървърната страна е по-сигурно и управляемо.
Нека започнем нашата демонстрация:
За клиента ще използваме react-native, а за страната на сървъра ще използваме NodeJs/ExpressJs.
1 — Създайте ново приложение за реакция:
npx react-native init AwesomeProject
Забележка: — Следвайте официалната документация за настройка на средата на Android/Ios тук.
2 — Създайте сървърен проект:
npx express-generator server
За повече информация относно ExpressJ отидете тук.
3 — Нека инсталираме паспортни пакети от страната на сървъра
npm i -save passport-google-oauth20 passport
Сега какво следва, ще трябва да конфигурираме извикване / обратно извикване на API за OAuth 2 в конзолата за разработчици на Google
a — Навигирайте и влезте в: https://console.developers.google.com/
b — Създайте нов проект
c — След като бъде създаден, изберете проект oauth2demo и отидете на идентификационни данни
d — Кликнете върху „Създаване на идентификационни данни“ и изберете „Oauth клиентски идентификатор“
e — Конфигурирайте екрана за съгласие, изберете външен и следвайте инструкциите за създаване на Oauth2 клиентски идентификатор.
f — Настройте оторизирани източници на JavaScript: тъй като използваме мобилно приложение локално, нямаме директен достъп до localhost, така че в този случай ще използваме pagekite, за да изложим сървъра си външно, добавете: http://42music.pagekite.me (Тук добавете свой собствен URL адрес)
За повече информация относно pagekite тук.
g — Настройте оторизирани URI адреси за пренасочване: добавете: http://42music.pagekite.me/auth/google/callback (Тук добавете свой собствен URL)
Запазете и вземете вашия ClientId и тайна, които ще използваме в сървъра с паспортна стратегия.
Сега нека конфигурираме сървъра: -
В app.js инициализирайте паспорта в експресното приложение
var passport = require('passport'); // Initialize passprt app.use(passport.initialize());
- Настройте паспортната стратегия в /route/index.js
- Добавяне на паспорт serializeUser и deserializeUser
-Създайте маршрутите за обратното повикване
var express = require('express'); var router = express.Router(); var passport = require('passport'); const GoogleStrategy = require('passport-google-oauth20').Strategy; passport.serializeUser((user, done) => { done(null, user); }) passport.deserializeUser((user, done) => { done(null, user) }) /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); passport.use(new GoogleStrategy({ clientID: "", // Add your clientID clientSecret: "", // Add the secret here callbackURL: '/auth/google/callback' }, (accessToken, refreshToken, profile, done) => { done(null, profile, accessToken ); })) // Googe Oauth2 router.get('/auth/google', passport.authenticate('google', { scope: ['profile', 'email'], })); // Google Oauth2 callback url router.get('/auth/google/callback', passport.authenticate('google'), (req, res, next) => { res.redirect("msrm42app://msrm42app.io?id=" + req.user.id); }); module.exports = router;
Демонстрация
Нека настроим нашето React-native приложение:
a — Стартирайте своето естествено приложение за реакция на виртуално или физическо устройство
b — в App.js създайте бутон за google OAuth 2 с връзка към: http://42music.pagekite.me/auth/google
import React, { useEffect, useState } from 'react'; import { SafeAreaView, StyleSheet, ScrollView, TouchableOpacity, Linking, View, Text, StatusBar, } from 'react-native'; import { Header, Colors, } from 'react-native/Libraries/NewAppScreen'; const App: () => React$Node = () => { const [data, setData] = useState(""); const handleOpenURL = ({ url }) => { if (url.indexOf("?id") !== -1) { if (url) setData(url); } }; useEffect(() => { // Your code here Linking.addEventListener('url', handleOpenURL); }, []); return ( <> <StatusBar barStyle="dark-content" /> <SafeAreaView> <ScrollView contentInsetAdjustmentBehavior="automatic" style={styles.scrollView}> <Header /> <Text> {data === "" ? null : data} </Text> <View style={styles.body}> <TouchableOpacity style={styles.socialBtn} onPress={() => Linking.openURL('http://42music.pagekite.me/auth/google')}> <Text style={styles.buttonText} > {data === "" ? "Connect via Google" : "You are connected !"}</Text> </TouchableOpacity> </View> </ScrollView> </SafeAreaView> </> ); }; const styles = StyleSheet.create({ body: { backgroundColor: Colors.white, }, socialBtn: { margin: 30, backgroundColor: '#1f5c9e', paddingVertical: 10, }, buttonText: { color: '#fff', fontWeight: 'bold', textAlign: 'center' }, }); export default App;
c — След като OAuth2 google е успешен, трябва да пренасочим потребителя към нашето приложение и за това ще използваме дълбоко свързване на react-native.
В ./android/app/src/main/AndroidManifest.xml добавете intent-filter
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.oauth2app"> <uses-permission android:name="android.permission.INTERNET" /> <application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="false" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter android:label="musicroom"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="msrm42app" android:host="msrm42app.io" /> </intent-filter> </activity> <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" /> </application> </manifest>
d — в страната на сървъра, след като Oauth2 е успешен пренасочване към приложението:
res.redirect("msrm42app://msrm42app.io?id=" + req.user.id);
Въведете парола и след това се свържете
Можете да използвате същия метод за прилагане на други стратегии.
Изходният код тук.