You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于React Native的仅手机号AWS Amplify身份验证教程求助

React Native 手机号短信验证码登录实现指南

一、核心方案选择

  • Firebase Authentication:集成成本最低,自带短信验证能力,适合快速搭建原型或中小项目
  • 自定义后端+第三方短信服务:对接阿里云、腾讯云等短信平台,灵活性更高,适合需要定制业务逻辑的场景
  • 海外第三方SDK:比如Twilio、Plivo,适合面向海外用户的项目

二、基于Firebase Auth的快速实现步骤

1. 环境准备

  • 安装依赖:npm install @react-native-firebase/app @react-native-firebase/auth
  • 按Firebase官方流程完成iOS/Android端的配置(添加google-services配置文件)

2. 完整验证流程代码示例

步骤1:请求发送验证码

import auth from '@react-native-firebase/auth';
import { useState } from 'react';
import { View, TextInput, Button, Alert } from 'react-native';

const PhoneAuth = () => {
  const [phoneNum, setPhoneNum] = useState('+8613xxxxxxxxx');
  const [otpCode, setOtpCode] = useState('');
  const [confirmation, setConfirmation] = useState(null);

  // 请求发送验证码
  const requestOtp = async () => {
    if (!phoneNum.match(/^\+\d{10,15}$/)) {
      Alert.alert('请输入正确格式的手机号(含国家码)');
      return;
    }
    try {
      const confirm = await auth().signInWithPhoneNumber(phoneNum);
      setConfirmation(confirm);
      Alert.alert('验证码已发送,请注意查收');
    } catch (err) {
      Alert.alert(`发送失败:${err.message}`);
    }
  };

  // 验证验证码
  const verifyOtp = async () => {
    if (!otpCode || otpCode.length !== 6) {
      Alert.alert('请输入6位验证码');
      return;
    }
    try {
      await confirmation.confirm(otpCode);
      const currentUser = auth().currentUser;
      console.log('登录成功,用户信息:', currentUser);
      // 此处添加登录成功后的页面跳转逻辑
    } catch (err) {
      Alert.alert(`验证失败:${err.message}`);
    }
  };

  return (
    <View style={{ padding: 24 }}>
      <TextInput
        placeholder="输入手机号(含国家码,如+86)"
        value={phoneNum}
        onChangeText={setPhoneNum}
        keyboardType="phone-pad"
        style={{ borderBottomWidth: 1, padding: 8, marginBottom: 20 }}
      />
      {!confirmation ? (
        <Button title="发送验证码" onPress={requestOtp} />
      ) : (
        <>
          <TextInput
            placeholder="输入6位验证码"
            value={otpCode}
            onChangeText={setOtpCode}
            keyboardType="number-pad"
            maxLength={6}
            style={{ borderBottomWidth: 1, padding: 8, marginVertical: 20 }}
          />
          <Button title="验证登录" onPress={verifyOtp} />
        </>
      )}
    </View>
  );
};

export default PhoneAuth;

三、自定义后端实现方案(适合定制化需求)

1. 后端核心逻辑(Node.js示例)

  • 对接短信服务商API生成并发送6位随机验证码
  • 将验证码与手机号绑定,存入Redis并设置5分钟过期时间
  • 提供两个接口:/api/send-otp(接收手机号发送验证码)、/api/verify-otp(验证验证码并返回登录凭证)

2. 前端配合代码

import axios from 'axios';
import AsyncStorage from '@react-native-async-storage/async-storage';

// 请求发送验证码
const sendCustomOtp = async (phoneNum) => {
  try {
    await axios.post('/api/send-otp', { phoneNumber: phoneNum });
    Alert.alert('验证码已发送');
  } catch (err) {
    Alert.alert(`发送失败:${err.response.data.msg}`);
  }
};

// 验证验证码
const verifyCustomOtp = async (phoneNum, code) => {
  try {
    const res = await axios.post('/api/verify-otp', { phoneNumber: phoneNum, code });
    await AsyncStorage.setItem('authToken', res.data.token);
    Alert.alert('登录成功');
    // 跳转至首页
  } catch (err) {
    Alert.alert(`验证失败:${err.response.data.msg}`);
  }
};

四、关键注意事项

  • 手机号格式:必须包含国家码,避免跨地区格式混乱
  • 安全防护:自定义后端需限制验证码请求频率,防止暴力破解
  • 错误处理:覆盖验证码过期、发送失败、格式错误等场景,给用户明确提示
  • 权限配置:iOS需在Info.plist添加短信权限描述,Android在AndroidManifest.xml配置网络权限

内容的提问来源于stack exchange,提问作者coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:22:24