首页 > 解决方案 > OAuth 访问 node.js 中的令牌验证

问题描述

我正在开发一个颤振应用程序,并希望使用 facebook 和 google oauths 来验证我的用户。这是客户端上完美运行的代码。

import 'package:flutter/material.dart';
import 'package:flutter_facebook_login/flutter_facebook_login.dart';
import 'package:http/http.dart' as http;
import 'dart:convert' as JSON;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool isLoggedIn = false;
  Map userProfile;
  final facebookLogin = FacebookLogin();

  _loginWithFB() async {
    final result = await facebookLogin.logIn(['email']);

    switch (result.status) {
      case FacebookLoginStatus.loggedIn:
        final token = result.accessToken.token;
        final graphResponse = await http.get(
            'https://graph.facebook.com/v2.12/me?fields=name,picture,email&access_token=${token}');
        final profile = JSON.jsonDecode(graphResponse.body);
        print(profile);
        setState(() {
          userProfile = profile;
          isLoggedIn = true;
        });
        break;

      case FacebookLoginStatus.cancelledByUser:
        setState(() => isLoggedIn = false);
        break;
      case FacebookLoginStatus.error:
        setState(() => isLoggedIn = false);
        break;
    }
  }

  _logoutWithFB() {
    facebookLogin.logOut().then((value) => setState(() => isLoggedIn = false));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: isLoggedIn
            ? Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Image.network(
                    "http://placehold.it/50x50",
                    height: 50.0,
                    width: 50.0,
                  ),
                  SizedBox(
                    height: 50.0,
                  ),
                  OutlineButton(
                    onPressed: _logoutWithFB,
                    child: Text('Logout'),
                  ),
                ],
              )
            : OutlineButton(
                onPressed: _loginWithFB,
                child: Text('Facebook login'),
                color: Colors.blueAccent,
              ),
      ),
    );
  }
}

我要使用的逻辑是登录,用户使用 facebook 或 google 注册,我得到一些基本信息并要求用户在另一个屏幕中添加一些进一步的信息,然后在提交时用户信息和令牌被发送到后端(这是一个 node.js api)。\

在背面,我想使用 facebook 或 google 验证从前端收到的令牌,如果配置文件 id 与收到的用户信息匹配,则保存从前端收到的用户信息,然后将创建一个 JWT 并将其发送到前端.

我现在的挑战是如何在 node.js 端验证 oauth 令牌。

标签: node.jsflutteroauthfacebook-logingoogle-signin

解决方案


用户 -> 登录 Facebook -> 生成令牌 -> 发送到后端的令牌 -> 中间件 Nodejs -> 检查 user_id 是否存在 -> 生成 JWT -> sendBackTo 客户端。

在这种情况下,您必须在后端 nodejs 中创建一个中间件函数非常简单。

const express = require("express");
const app = express();

//function that return JWT token
String check_user_id(req,res,next)  async
{
var uid = req.params.uid
//Query database check if userIdexist or not 
check_db(uid) 
//if it exist
next();
return GenerateJwt(userId)
else 
{
//Signup the userid
SignUp(userId);
//generateJWT
next();
return GenerateJwt(userId); 
}

}

app.get('/check_uid/:uid',check_user_id,(res,req,next) => 
{

res.send({'message':'verified'});

}

推荐阅读