尝试实现 Linkedin Oauth2.0 完整认证流程
Trying to implement Linkedin Oauth2.0 full authentication flow
我正在尝试实施 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。我尝试在响应 header 中将其设置为 cookie,但它从未显示在 session cookie 中。我应该使用 JWT Cookie 吗?
这是我的身份验证回调 lambda 的代码,它位于 /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
Would should I be doing with the access_token?
访问令牌必须保存在您的数据库或服务器中,并link它给该用户,因此以后访问该用户的linkedin 数据或个人资料都将使用此访问令牌
But my question is how should I store the access_token
我相信您已经有了某种数据库,并且在其中存储了有关用户的信息,因此此令牌应与用户信息一起保存
我正在尝试实施 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。我尝试在响应 header 中将其设置为 cookie,但它从未显示在 session cookie 中。我应该使用 JWT Cookie 吗?
这是我的身份验证回调 lambda 的代码,它位于 /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
Would should I be doing with the access_token?
访问令牌必须保存在您的数据库或服务器中,并link它给该用户,因此以后访问该用户的linkedin 数据或个人资料都将使用此访问令牌
But my question is how should I store the access_token
我相信您已经有了某种数据库,并且在其中存储了有关用户的信息,因此此令牌应与用户信息一起保存