@hapic/oauth2
Version:
A oauth2 api client based on axios.
225 lines (186 loc) • 5.44 kB
Markdown
# @hapic/oauth2 🛡️
[](https://badge.fury.io/js/@hapic%2Foauth2)
[](https://github.com/Tada5hi/hapic/actions/workflows/main.yml)
[](https://snyk.io/test/github/Tada5hi/hapic)
[](https://conventionalcommits.org)
This client provides an easy way to authenticate and authorize **users**, **clients**, **robots**, ...
using OAuth2 and OpenID Connect standards.
With this API client, developers can easily interact with the server's endpoints,
such as authentication flows, token issuance, and user management.
The client offers a range of abstractions to simplify interactions with the server
and speed up the development process.
Whether you are an experienced developer or new to OAuth2/OpenID,
this API client is a powerful tool to help you implement secure **users**, **clients** & **robots** authentication
and authorization in your applications.
**Table of Contents**
- [Documentation](#documentation)
- [Installation](#installation)
- [Usage](#usage)
- [Authorize](#authorize)
- [Token](#token)
- [UserInfo](#userInfo)
- [License](#license)
## Documentation
To read the docs, visit [https://hapic.tada5hi.net](https://hapic.tada5hi.net)
## Installation
```bash
npm install @hapic/oauth2 --save
```
## Usage
### Authorize
**`URL`**
```typescript
import { OAuth2Client } from '@hapic/oauth2';
const client = new OAuth2Client({
request: {
baseURL: 'http://localhost:3000/',
},
options: {
/**
* default: /authorize
*/
authorizationEndpoint: 'https://example.com/authorize'
}
});
const authorizeUrl = client.authorize.buildURL({
client_id: 'client',
/**
* Relative or absolute url.
*/
redirect_uri: 'http://localhost:3000/redirect-callback'
});
console.log(authorizeUrl);
// https://example.com/authorize?
// response_type=code&
// client_id=client&
// redirect_uri=http://localhost:3000/redirect-callback
```
### Token
**`Create`**
```typescript
import { OAuth2Client } from '@hapic/oauth2';
const client = new OAuth2Client({
request: {
baseURL: 'http://localhost:3000/'
},
options: {
/**
* default: /token
*/
tokenEndpoint: 'https://example.com/authorize',
clientId: 'client',
clientSecret: 'secret',
}
});
let token = await client.token.createWithRefreshTokenGrant({
refresh_token: 'refresh_token'
});
token = await client.token.createWithClientCredentialsGrant({
// optional, if defined globally
client_id: 'foo',
client_secret: 'bar',
});
token = await client.token.createWithPasswordGrant({
username: 'admin',
password: 'start123'
});
token = await client.token.createWithAuthorizationCodeGrant({
state: 'state',
code: 'code'
});
token = await client.token.createWithRobotCredentialsGrant({
id: 'system',
secret: 'start123'
});
console.log(token);
// { token_type: 'Bearer', access_token: 'xxx', refres_token: 'xxx', ...}
```
**`Introspect`**
```typescript
import { OAuth2Client } from '@hapic/oauth2';
const client = new OAuth2Client({
request: {
baseURL: 'http://localhost:3000/'
},
options: {
/**
* default: /token/introspect
*/
introspectionEndpoint: 'https://example.com/token/introspect'
}
});
let token = await client.token.introspect({
token: 'xxx',
// token_type_hint: 'xxx',
});
// authorize introspection request with custom header
token = await client.token.introspect(
{
token: 'xxx',
// token_type_hint: 'xxx'
},
{
authorizationHeader: 'xxx',
}
)
// authorize introspection request with existing client token.
token = await client.token.introspect(
{
token: 'xxx',
// token_type_hint: 'xxx'
},
{
authorizationHeaderInherit: true,
}
)
// authorize introspection request with client credentials
token = await client.token.introspect(
{
token: 'xxx',
client_id: 'client',
client_secret: 'secret'
}
)
// authorize introspection request with client credentials header
token = await client.token.introspect(
{
token: 'xxx'
},
{
clientId: 'client',
clientSecret: 'secret'
}
);
console.log(token);
// { active: true, ... }
```
### UserInfo
```typescript
import { OAuth2Client } from '@hapic/oauth2';
const client = new OAuth2Client({
request: {
baseURL: 'http://localhost:3000/'
},
options: {
/**
* default: /userinfo
*/
userInfoEndpoint: 'https://example.com/users/@me'
}
});
// authenticate by authorization string
let userInfo = await client.userInfo.get('Bearer xxx');
// authenticate by authorization object configuration
userInfo = await client.userInfo.get({
type: 'Basic',
username: 'admin',
password: 'start123'
});
// authenticate by existing client token
userInfo = await client.userInfo.get();
console.log(userInfo);
// { id: 'xxx', name: 'admin', ...}
```
## License
Made with 💚
Published under [MIT License](./LICENSE).