Skip to content

Instantly share code, notes, and snippets.

@spiritbroski
Last active December 7, 2020 03:00
Show Gist options
  • Select an option

  • Save spiritbroski/d32bd67e60cea97b626a4e65c15a6b94 to your computer and use it in GitHub Desktop.

Select an option

Save spiritbroski/d32bd67e60cea97b626a4e65c15a6b94 to your computer and use it in GitHub Desktop.
"use strict";
const axios = require("axios");
const jwt = require("jsonwebtoken");
const formUrlEncoded = (x) =>
Object.keys(x).reduce((p, c) => p + `&${c}=${encodeURIComponent(x[c])}`, "");
const github = async function (params) {
const cloudant = require("@cloudant/cloudant")({
url: params.__bx_creds.cloudantnosqldb.url,
plugins: [
{ iamauth: { iamApiKey: params.__bx_creds.cloudantnosqldb.apikey } },
],
});
if (params.code) {
const { access_token } = await authenticate({ params });
const { login,email } = await getUsername({ access_token });
const {token} = await checkUsername({
email,
username: login,
cloudant,
access_token,
token_pass: params.token_pass,
});
if(token){
return {
headers: { location: `${params.frontend_url}/dashboard` },
statusCode: 302
};
}else{
return {
headers: { location: params.frontend_url },
statusCode: 302
};
}
} else {
return {
headers: { location: `${params.frontend_url}/login` },
statusCode: 302
};
}
};
module.exports.github = github;
async function authenticate({ params }) {
const { data } = await axios({
url: "https://github.com/login/oauth/access_token",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",
},
data: formUrlEncoded({
client_id: params.github_client_id,
client_secret: params.github_client_secret,
code: params.code,
}),
method: "POST",
});
return data;
}
async function getUsername({ access_token }) {
const { data } = await axios({
url: "https://api.github.com/user",
headers: {
Authorization: `token ${access_token}`,
Accept: "application/vnd.github.v3+json",
},
method: "GET",
});
return data;
}
async function checkUsername({ username, access_token, cloudant, token_pass,email }) {
const token = jwt.sign({ access_token }, token_pass);
const db = cloudant.db.use("ecommerce");
const query = {
selector: {
$and: [{ username: { $eq: username } }, { collection: { $eq: "user" } }],
},
};
const res = await db.find(query);
if (res.docs.length === 1) {
const { _id, _rev } = res.docs[0];
const user = {
_id,
_rev,
username,
access_token,
token,
email,
collection: "user",
};
const {ok}= await db.insert(user);
return ok && {token};
} else {
const user = { username,email, access_token, token, collection: "user" };
const {ok}=await db.insert(user);
return ok && {token};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment