npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@bzsklvnt/remix-auth-linkedin

v2.0.0

Published

The Linkedin strategy is used to authenticate users against a Linkedin account. It extends the [OAuth2Strategy](https://github.com/sergiodxa/remix-auth-oauth2).

Downloads

470

Readme

LinkedinStrategy

The Linkedin strategy is used to authenticate users against a Linkedin account. It extends the OAuth2Strategy.

Attribution and Acknowledgments

This project is a fork of remix-auth-linkedin by juhanakristian. We are immensely grateful to the original authors for their hard work and dedication in creating a foundation that has inspired our version. Our modifications and extensions are built upon the robust groundwork they established.

For details about the original project and its features, please visit the Original Repository.

We aim to respect the original vision while also adding our unique contributions, which are documented in our changelog and release notes. Our project follows the licensing terms set forth in the original, adhering to the principles of open-source collaboration and mutual respect for the creators' efforts.

We encourage users and contributors to also explore the original repository to understand the origins of this project and appreciate the collective effort involved in its ongoing development.

In this version we aimed to make changes, so that this project is compatible with @remix-run/server-runtime v2 >.

Supported runtimes

| Runtime | Has Support | | ---------- | ----------- | | Node.js | ✅ | | Cloudflare | ✅ |

Usage

Create an OAuth application

First you need to create a new application in the Linkedin's developers page. Then I encourage you to read this documentation page, it explains how to configure your app and gives you useful information on the auth flow. The app is mandatory in order to obtain a clientID and client secret to use with the Linkedin's API.

Create the strategy instance

// linkedin.server.ts
import { createCookieSessionStorage } from 'remix';
import { Authenticator } from 'remix-auth';
import { LinkedinStrategy } from "remix-auth-linkedin";

// Personalize this options for your usage.
const cookieOptions = {
	path: '/',
	httpOnly: true,
	sameSite: 'lax' as const,
	maxAge: 24 * 60 * 60 * 1000 * 30,
	secrets: ['THISSHOULDBESECRET_AND_NOT_SHARED'],
	secure: process.env.NODE_ENV !== 'development',
};

const sessionStorage = createCookieSessionStorage({
	cookie: cookieOptions,
});

export const authenticator = new Authenticator<string>(sessionStorage, {
	throwOnError: true,
});

const linkedinStrategy = new LinkedinStrategy(
   {
      clientID: "YOUR_CLIENT_ID",
      clientSecret: "YOUR_CLIENT_SECRET",
      // LinkedIn is expecting a full URL here, not a relative path
      // see: https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow?tabs=HTTPS1#step-1-configure-your-application
      callbackURL: "https://example.com/auth/linkedin/callback";
   },
   async ({accessToken, refreshToken, extraParams, profile, context}) => {
      /*
         profile:
         type LinkedinProfile = {
            id: string;
            displayName: string;
            name: {
               givenName: string;
               familyName: string;
            };
            emails: Array<{ value: string }>;
            photos: Array<{ value: string }>;
            _json: LiteProfileData & EmailData;
         } & OAuth2Profile;
      */

      // Get the user data from your DB or API using the tokens and profile
      return User.findOrCreate({ email: profile.emails[0].value });
   }
);

authenticator.use(linkedinStrategy, 'linkedin');

Setup your routes

// app/routes/login.tsx
export default function Login() {
   return (
      <Form action="/auth/linkedin" method="post">
         <button>Login with Linkedin</button>
      </Form>
   )
}
// app/routes/auth/linkedin.tsx
import { ActionFunction, LoaderFunction } from 'remix'
import { authenticator } from '~/linkedin.server'

export let loader: LoaderFunction = () => redirect('/login')
export let action: ActionFunction = ({ request }) => {
   return authenticator.authenticate('linkedin', request)
}
// app/routes/auth/linkedin/callback.tsx
import { ActionFunction, LoaderFunction } from 'remix'
import { authenticator } from '~/linkedin.server'

export let loader: LoaderFunction = ({ request }) => {
   return authenticator.authenticate('linkedin', request, {
      successRedirect: '/dashboard',
      failureRedirect: '/login',
   })
}