Попытка реализовать полный поток аутентификации Linkedin Oauth2.0 - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь реализовать процесс входа и аутентификации Linkedin OAuth2.0, и я не могу найти какие-либо ресурсы, которые шаг за шагом показывают, что именно должно произойти.

Мой проект построенв next.js и размещается с использованием теперь безсерверного развертывания Zeit.Таким образом, мой проект - это, по сути, куча лямбд, как для внешнего, так и для внутреннего конца.

Пока у меня работает следующий поток:

1) пользователь перемещаетсяна страницу входа в систему и нажимает на кнопку «Войти с помощью Linkedin»

2) Кнопка перенаправляет клиента на URL-адрес аутентификации Linkedin, где, как они видят, будет отображаться приглашение «Linkedin»

3) Подписи пользователяin и Linkedin перенаправляет на мой обратный вызов сервера. lambda

4) обратный вызов сервера lambda извлекает код авторизации из строки запроса

5) сервер отправляет запрос POST на конечную точку Linkedin accessToken для получения access_token

6) сервер получает ответ и извлекает access_token.

Сейчас он выполняет перенаправление 301 для перенаправления пользователя на другую страницу.

Должен ли я делать с access_token?Я понимаю, что мне нужен токен для доступа к API-интерфейсам Linkedin для получения профиля пользователя и любых других сервисов API.Но мой вопрос, как я должен хранить access_token.Я попытался установить его в заголовке ответа как файл cookie, но он никогда не отображается в файлах cookie сеанса.Должен ли я использовать файлы cookie JWT?

Вот код моей лямбды обратного вызова аутентификации, который находится по адресу /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

1 Ответ

1 голос
/ 16 апреля 2019

Должен ли я работать с access_token?

Токен доступа должен быть сохранен в вашей базе данных или на сервере и связан с этим пользователем, поэтому любой доступ к этому пользователю в будущем возможен.данные или профиль будут использовать этот токен доступа

Но мой вопрос заключается в том, как мне хранить access_token

Я считаю, что у вас уже есть какая-то база данных, и в нейВы храните информацию о своих пользователях, поэтому этот токен должен быть сохранен вместе с пользовательской информацией

...