Как мобильный разработчик на определенном этапе вам придется реализовать стратегию OAuth 2 с помощью социальных сетей или других средств.

Эта статья не объясняет, что такое Oauth 2 и как он работает, поскольку в Интернете есть множество статей по этому поводу.

Вопрос в том, следует ли мне использовать Oauth 2 на стороне клиента или на стороне сервера?

Сторона клиента

Есть несколько пакетов вроде:

response-native-oauth, см. репозиторий здесь.

response-native-simple-auth см. репозиторий здесь.

Я пробовал некоторые из этих пакетов, в которых есть минусы и плюсы

Плюсы:

  • Это пакеты с открытым исходным кодом.
  • Есть много примеров реализации.
  • Легко реализовать (не все пакеты).

Минусы:

  • Сопровождение пакетов.
  • Дополнительная конфигурация для URI перенаправления.
  • Нет клиентского контроля.
  • Невозможно получить доступ к данным, возвращаемым из обратного вызова OAuth 2, напрямую с сервера.

На стороне сервера

Реализация на стороне сервера более безопасна и управляема.

Начнем нашу демонстрацию:

Для клиента мы будем использовать response-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.

а - Перейдите и войдите в: https://console.developers.google.com/

б - Создать новый проект

c - После создания выберите проект oauth2demo и перейдите к учетным данным

г - Нажмите «Создать учетные данные» и выберите «Идентификатор клиента Oauth».

e - Настройте экран согласия, выберите внешний и следуйте инструкциям по созданию идентификатора клиента Oauth2.

f - Настроить авторизованные источники JavaScript: поскольку мы используем мобильное приложение локально, у нас нет прямого доступа к localhost, поэтому в этом случае мы будем использовать pagekite для внешнего доступа к нашему серверу, добавив: http://42music.pagekite.me (Здесь добавьте свой собственный URL)

Более подробную информацию о пейдж-кайте можно найти здесь.

g - Настройка авторизованных URI перенаправления: add: 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:

a - Запустите приложение с поддержкой реакции на виртуальном или физическом устройстве.

б - в App.js создать кнопку для google OAuth 2 со ссылкой на: http://42music.pagekite.me / auth / goog файл

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 - После того, как Google OAuth2 будет успешным, нам нужно перенаправить пользователя в наше приложение, и для этого мы будем использовать встроенные прямые ссылки.

В ./android/app/src/main/AndroidManifest.xml добавьте фильтр намерений

<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);

Введите пароль и затем подключитесь

Вы можете использовать тот же метод для реализации других стратегий.

Исходный код здесь.