尝试实现Linkedin Oauth2.0完整身份验证流程

时间:2019-04-10 09:50:55

标签: node.js authentication oauth-2.0 session-cookies zeit-now

我正在尝试实现Linkedin OAuth2.0登录和身份验证流程,但是我似乎找不到任何能逐步显示出确切情况的资源。

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

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

1)用户导航到/ login页面,然后单击“使用Linkedin登录”

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

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

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

5)服务器将POST发送到Linkedin的accessToken端点以检索access_token

6)服务器接收响应并提取access_token。

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

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

这是我的auth回调lambda的代码,它位于doPost

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

1 个答案:

答案 0 :(得分:1)

  

我应该使用access_token吗?

访问令牌必须保存在您的数据库或服务器中并链接到该用户,以便将来对该用户的linkedin数据或个人资料的任何访问都将使用此访问令牌

  

但是我的问题是我应该如何存储access_token

我相信您已经有了某种数据库,并且其中存储了有关用户的信息,因此该令牌应与用户信息一起保存