Node.js 正在尝试实现Linkedin Oauth2.0完整身份验证流

Node.js 正在尝试实现Linkedin Oauth2.0完整身份验证流,node.js,authentication,oauth-2.0,session-cookies,vercel,Node.js,Authentication,Oauth 2.0,Session Cookies,Vercel,我正在尝试实现Linkedin OAuth2.0登录和身份验证流程,但我似乎找不到任何资源一步一步地显示需要发生什么 我的项目是在next.js中构建的,并使用Zeit现在的无服务器部署托管。因此,我的项目基本上是一堆lambda,用于前端和后端 到目前为止,我的以下流程工作正常: 1) 用户导航到/登录页面并单击使用Linkedin登录按钮 2) 该按钮将客户端路由到Linkedin身份验证URL,在那里他们将看到Linkedin登录提示 3) 用户登录,Linkedin重定向到我的服务器回调

我正在尝试实现Linkedin OAuth2.0登录和身份验证流程,但我似乎找不到任何资源一步一步地显示需要发生什么

我的项目是在next.js中构建的,并使用Zeit现在的无服务器部署托管。因此,我的项目基本上是一堆lambda,用于前端和后端

到目前为止,我的以下流程工作正常:

1) 用户导航到/登录页面并单击使用Linkedin登录按钮

2) 该按钮将客户端路由到Linkedin身份验证URL,在那里他们将看到Linkedin登录提示

3) 用户登录,Linkedin重定向到我的服务器回调url lambda

4) 服务器回调lambda从查询字符串中检索授权代码

5) 服务器向Linkedin的accessToken端点发送POST以检索访问令牌

6) 服务器接收响应并提取访问令牌

现在它会执行301重定向,将用户重定向到另一个页面

我应该使用访问令牌吗?我知道我需要令牌来访问Linkedin的API,以检索用户配置文件和任何其他API服务。但我的问题是如何存储访问令牌。我尝试在响应头中将其设置为cookie,但它从未显示在会话cookie中。我应该使用JWT Cookies吗

下面是位于
/auth/linkedin/callback

// api/login.js

const { json, send, createError, run } = require('micro');
const fetch = require('isomorphic-unfetch');
const querystring = require('querystring');
const nodeCookie = require('node-cookie');
const url = require('url');

const callback = async (req, res) => {

  let { query } = url.parse(req.url)
  let { code, state } = querystring.parse(query)

  // const redirectUri = req.redirectUri;
  let tokenUrl = `https://www.linkedin.com/oauth/v2/accessToken` + '?' +
    querystring.stringify({
      grant_type: 'authorization_code',
      code: code,
      redirect_uri: 'https://memory-app.sfkiwi.now.sh/auth/linkedin/callback',
      client_id: 'XXXXXXXXXXX',
      client_secret: 'XXXXXXXXXXXXX'
    });

  try {
    const response = await fetch(
      tokenUrl, {
        method: 'POST',
        headers: {
          'Content-Type': 'x-www-form-urlencoded'
        }
      });

    if (response.ok) {

      let { access_token, expires_in } = await response.json();

      nodeCookie.create(res, 'liauth', String(access_token));

      res.setHeader('Location', '/profile');
      send(res, 301);

    } else {
      send(res, 500, response.status);
    }

  } catch(err) {
    send(res, 500, 'Failed to retrieve access token from Auth server');
  }
};

module.exports = (req, res) => run(req, res, callback);

登录页面的前端代码

async handleClick(event) {
    event.preventDefault();

    let qs = querystring.stringify({
      response_type: 'code',
      client_id: 'XXXXXXXXXXXX',
      redirect_uri: this.props.apiUrl + '/auth/linkedin/callback',
      state: 'DCEeFWf45A53sdfKef424',
      scope: 'r_liteprofile r_emailaddress w_member_social'
    });

    let url = 'https://www.linkedin.com/oauth/v2/authorization' + '?' + qs

    Router.push(url);
  }

  render() {
    return (
      <Layout>
        <div className="login">
          <button onClick={this.handleClick}>Login with Linkedin</button>
        </div>
      </Layout>
    );
  }
}

export default Login
异步handleClick(事件){
event.preventDefault();
让qs=querystring.stringify({
响应类型:“代码”,
客户id:'XXXXXXXXXX',
重定向_uri:this.props.apiUrl+'/auth/linkedin/callback',
状态:“DCEeFWf45A53sdfKef424”,
范围:'r_liteprofile r_emailaddress w_member_social'
});
让url为空https://www.linkedin.com/oauth/v2/authorization“+”?“+qs”
路由器推送(url);
}
render(){
返回(
使用Linkedin登录
);
}
}
导出默认登录名
我应该使用访问令牌吗

访问令牌必须保存在您的数据库或服务器中,并将其链接到该用户,因此将来对该用户的linkedin数据或配置文件的任何访问都将使用该访问令牌

但我的问题是我应该如何存储访问令牌

我相信您已经有了某种数据库,并且在其中存储了有关用户的信息,所以这个令牌应该和用户信息一起保存