Skip to content

Repository files navigation

Angular2-Token

Angular2-Token

Join the chat at https://gitter.im/lynndylanhurley/devise_token_authnpm versionnpm downloadsBuild StatusAngular 2 Style Guide

Token based authentication service for Angular2 with multiple user support. Angular2-Token works best with the devise token auth gem for Rails. Angular2-Token is currently in Alpha. Any contribution is much appreciated.

You can try out Angular2-Token here.

The repository can be found here.

Installation

  1. Install Angular2-Token via NPM with

    npm install angular2-token
  2. Import and add Angular2TokenService to your main module. Angular2TokenService depends on HttpModule and RouterModule, so make sure you import them too.

    import{Angular2TokenService}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})
  3. Inject Angular2TokenService into your main component and call .init().

    constructor(private_tokenService: Angular2TokenService){this._tokenService.init();}

Quickstart (αlpha)

Quickstart includes the necessary forms and routing to quickly use Angular2-Token with your Project. A live demo can be found here.

Quickstart is currently in αlpha, please use with caution.

Quickstart

  1. Add A2tUiModule to your main module.
    import{Angular2TokenService,A2tUiModule}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule,A2tUiModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})

The A2tUiModule adds the following routes to your project:

RouteDescription
session/sign-inSign in form
session/sign-upSign out form
session/reset-passwordReset password form
session/update-passwordUpdate password for email redirect

On successful sign in the user will be redirect to restricted.

Content

Configuration

Configuration options can be passed as Angular2TokenOptions via .init().

Default Configuration

constructor(private_tokenService: Angular2TokenService){this._tokenService.init({apiPath: null,signInPath: 'auth/sign_in',signInRedirect: null,signInStoredUrlStorageKey: null,signOutPath: 'auth/sign_out',validateTokenPath: 'auth/validate_token',signOutFailedValidate: false,registerAccountPath: 'auth',deleteAccountPath: 'auth',registerAccountCallback: window.location.href,updatePasswordPath: 'auth',resetPasswordPath: 'auth/password',resetPasswordCallback: window.location.href,oAuthHost: window.location.origin,oAuthPaths: {github: 'auth/github'},oAuthCallbackPath: 'oauth_callback',oAuthWindowType: 'newWindow',oAuthWindowOptions: null,userTypes: null,globalOptions: {headers: {'Content-Type': 'application/json','Accept': 'application/json'}}});}
OptionsDescription
apiBase?: stringSets the server for all API calls.
apiPath?: stringSets base path all operations are based on
signInPath?: stringSets path for sign in
signInRedirect?: stringSets redirect path for failed CanActivate
signInStoredUrlStorageKey?: stringSets locale storage key to store URL before displaying signIn page
signOutPath?: stringSets path for sign out
validateTokenPath?: stringSets path for token validation
signOutFailedValidate?: booleanSigns user out when validation returns a 401 status
registerAccountPath?: stringSets path for account registration
deleteAccountPath?: stringSets path for account deletion
registerAccountCallback?: stringSets the path user are redirected to after email confirmation for registration
updatePasswordPath?: stringSets path for password update
resetPasswordPath?: stringSets path for password reset
resetPasswordCallback?: stringSets the path user are redirected to after email confirmation for password reset
userTypes?: UserTypes[]Allows the configuration of multiple user types (see Multiple User Types)
globalOptions?: GlobalOptionsAllows the configuration of global options (see below)
oAuthBase?: stringConfigure the OAuth server (used for backends on a different url)
oAuthPaths?: { [key:string]: string }Sets paths for sign in with OAuth
oAuthCallbackPath?: stringSets path for OAuth sameWindow callback
oAuthWindowType?:string`Window type for Oauth authentication
oAuthWindowOptions?: { [key:string]: string }Set additional options to pass into window.open()

Global Options

OptionsDescription
headers?: { [key:string]: string; }Define custom global headers as hashmap. Be careful when overwriting the default options, devise token auth will refuse requests without the Content-Type-Header set

Further information on paths/routes can be found at devise token auth

Service Methods

Once initialized Angular2TokenService offers methods for session management.

.signIn()

The signIn method is used to sign in the user with email address and password. The optional parameter type specifies the name of UserType used for this session.

signIn({email: string, password: string, userType?: string}): Observable<Response>

Example:

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.signOut()

The signOut method destroys session and session storage.

signOut(): Observable<Response>

Example:

this._tokenService.signOut().subscribe(res=>console.log(res),error=>console.log(error));

.registerAccount()

Sends a new user registration request to the Server.

registerAccount({email: string, password: string, passwordConfirmation: string, userType?: string}): Observable<Response>

Example:

this._tokenService.registerAccount({email: 'example@example.org',password: 'secretPassword',passwordConfirmation: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.deleteAccount()

Deletes the account for the signed in user.

deleteAccount(): Observable<Response>

Example:

this._tokenService.deleteAccount().subscribe(res=>console.log(res),error=>console.log(error));

.validateToken()

Validates the current token with the server.

validateToken(): Observable<Response>

Example:

this._tokenService.validateToken().subscribe(res=>console.log(res),error=>console.log(error));

.updatePassword()

Updates the password for the logged in user.

updatePassword({password: string, passwordConfirmation: string, currentPassword?: string, userType?: string, resetPasswordToken?: string}): Observable<Response>

Example:

this._tokenService.updatePassword({password: 'newPassword',passwordConfirmation: 'newPassword',passwordCurrent: 'oldPassword',resetPasswordToken: 'resetPasswordToken',}).subscribe(res=>console.log(res),error=>console.log(error));

.resetPassword()

Request a password reset from the server.

resetPassword({email: string, userType?: string}): Observable<Response>

Example:

this._tokenService.resetPassword({email: 'example@example.org',}).subscribe(res=>console.log(res),error=>console.log(error));

.signInOAuth()

Initiates OAuth authentication flow. Currently, it supports two window modes: newWindow (default) and sameWindow (settable in config as oAuthWindowType).

  • When oAuthWindowType is set to newWindow, .signInOAuth() opens a new window and returns an observable.

  • When oAuthWindowType is set to sameWindow, .signInOAuth() returns nothing and redirects user to auth provider. After successful authentication, it redirects back to oAuthCallbackPath. Application router needs to intercept this route and call processOAuthCallback() to fetch AuthData from params.

signInOAuth(oAuthType: string)

Example:

this._tokenService.signInOAuth('github').subscribe(res=>console.log(res),error=>console.log(error));

.processOAuthCallback()

Fetches AuthData from params sent via OAuth redirection in sameWindow flow.

processOAuthCallback()

Example

Callback route:

RouterModule.forRoot([{path: 'oauth_callback',component: OauthCallbackComponent}])

Callback component:

@Component({template: ''})exportclassOauthCallbackComponentimplementsOnInit{constructor(private_tokenService: Angular2TokenService){}ngOnInit(){this._tokenService.processOAuthCallback();}}

HTTP Service Wrapper

Angular2TokenService wraps all standard Angular2 Http Service calls for authentication and token processing. If apiPath is configured it gets added in front of path.

  • get(url: string, options?: RequestOptionsArgs): Observable<Response>
  • post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • delete(url: string, options?: RequestOptionsArgs): Observable<Response>
  • patch(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • head(url: string, options?: RequestOptionsArgs): Observable<Response>
  • options(url: string, options?: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.get('my-resource/1').map(res=>res.json()).subscribe(res=>console.log(res),error=>console.log(error));

Multiple User Types

An array of UserType can be passed in Angular2TokenOptions during init(). The user type is selected during sign in and persists until sign out. .currentUserType returns the currently logged in user.

Example:

this._tokenService.init({userTypes: [{name: 'ADMIN',path: 'admin'},{name: 'USER',path: 'user'}]});this._tokenService.signIn({email: 'example@example.com',password: 'secretPassword',userType: 'ADMIN'})this._tokenService.currentUserType;// ADMIN

Route Guards

Angular2-Token implements the CanActivate interface, so it can directly be used as a route guard. If the signInRedirect option is set the user will be redirected on a failed (=false) CanActivate using Router.navigate(). It currently does not distinguish between user types.

Example:

constrouterConfig: Routes=[{path: '',component: PublicComponent},{path: 'restricted',component: RestrictedComponent,canActivate: [Angular2TokenService]}];

Advanced Usage

More advanced methods can be used if a higher degree of customization is required.

.request()

More customized requests can be send with the .request()-function. It accepts the RequestOptionsArgs-Interface. More information can be found in the Angular2 API Reference here.

request(options: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.request({method: RequestMethod.Post,url: 'my-resource/1',data: mydata});

.userSignedIn()

Returns true if a user is signed in. It does not distinguish between user types.

userSignedIn(): boolean

.currentUserType

Returns current user type as string like specified in the options.

get currentUserType(): string

.currentUserData

Returns current user data as returned by devise token auth. This variable is null after page reload until the .validateToken() call is answerd by the backend.

get currentUserData(): UserData

.currentAuthData

Returns current authentication data which are used to set auth headers.

get currentAuthData(): AuthData

.currentAuthHeaders

Returns current authentication data as an HTTP ready Header object.

get currentAuthHeaders(): Header

Redirect original requested URL

If you want to redirect to the protected URL after signing in, you need to set signInStoredUrlStorageKey and in your code you can do something like this

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>{// You have to add Router DI in your componentthis.router.navigateByUrl(localStorage.getItem('redirectTo'));},error=>console.log(error));

Common Problems

CORS Configuration

If you are using CORS in your Rails API make sure that Access-Control-Expose-Headers includes access-token, expiry, token-type, uid, and client. For the rack-cors gem this can be done by adding the following to its config. More information can be found here. ruby :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client']

Missing Routes

Make sure that your projects includes some kind of routing.

Development

If the package is installed from Github specified in the package.json, you need to build the package locally.

cd ./node_modules/angular2-token
npm install
npm run build

Testing

npm test

Credits

Test config files based on Angular2 Webpack Starter by AngularClass

License

The MIT License (see the LICENSE file for the full text)

About

🔑 Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo:

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - hrangel/angular2-token: :key: Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo: · GitHub
Skip to content

Repository files navigation

Angular2-Token

Angular2-Token

Join the chat at https://gitter.im/lynndylanhurley/devise_token_authnpm versionnpm downloadsBuild StatusAngular 2 Style Guide

Token based authentication service for Angular2 with multiple user support. Angular2-Token works best with the devise token auth gem for Rails. Angular2-Token is currently in Alpha. Any contribution is much appreciated.

You can try out Angular2-Token here.

The repository can be found here.

Installation

  1. Install Angular2-Token via NPM with

    npm install angular2-token
  2. Import and add Angular2TokenService to your main module. Angular2TokenService depends on HttpModule and RouterModule, so make sure you import them too.

    import{Angular2TokenService}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})
  3. Inject Angular2TokenService into your main component and call .init().

    constructor(private_tokenService: Angular2TokenService){this._tokenService.init();}

Quickstart (αlpha)

Quickstart includes the necessary forms and routing to quickly use Angular2-Token with your Project. A live demo can be found here.

Quickstart is currently in αlpha, please use with caution.

Quickstart

  1. Add A2tUiModule to your main module.
    import{Angular2TokenService,A2tUiModule}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule,A2tUiModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})

The A2tUiModule adds the following routes to your project:

RouteDescription
session/sign-inSign in form
session/sign-upSign out form
session/reset-passwordReset password form
session/update-passwordUpdate password for email redirect

On successful sign in the user will be redirect to restricted.

Content

Configuration

Configuration options can be passed as Angular2TokenOptions via .init().

Default Configuration

constructor(private_tokenService: Angular2TokenService){this._tokenService.init({apiPath: null,signInPath: 'auth/sign_in',signInRedirect: null,signInStoredUrlStorageKey: null,signOutPath: 'auth/sign_out',validateTokenPath: 'auth/validate_token',signOutFailedValidate: false,registerAccountPath: 'auth',deleteAccountPath: 'auth',registerAccountCallback: window.location.href,updatePasswordPath: 'auth',resetPasswordPath: 'auth/password',resetPasswordCallback: window.location.href,oAuthHost: window.location.origin,oAuthPaths: {github: 'auth/github'},oAuthCallbackPath: 'oauth_callback',oAuthWindowType: 'newWindow',oAuthWindowOptions: null,userTypes: null,globalOptions: {headers: {'Content-Type': 'application/json','Accept': 'application/json'}}});}
OptionsDescription
apiBase?: stringSets the server for all API calls.
apiPath?: stringSets base path all operations are based on
signInPath?: stringSets path for sign in
signInRedirect?: stringSets redirect path for failed CanActivate
signInStoredUrlStorageKey?: stringSets locale storage key to store URL before displaying signIn page
signOutPath?: stringSets path for sign out
validateTokenPath?: stringSets path for token validation
signOutFailedValidate?: booleanSigns user out when validation returns a 401 status
registerAccountPath?: stringSets path for account registration
deleteAccountPath?: stringSets path for account deletion
registerAccountCallback?: stringSets the path user are redirected to after email confirmation for registration
updatePasswordPath?: stringSets path for password update
resetPasswordPath?: stringSets path for password reset
resetPasswordCallback?: stringSets the path user are redirected to after email confirmation for password reset
userTypes?: UserTypes[]Allows the configuration of multiple user types (see Multiple User Types)
globalOptions?: GlobalOptionsAllows the configuration of global options (see below)
oAuthBase?: stringConfigure the OAuth server (used for backends on a different url)
oAuthPaths?: { [key:string]: string }Sets paths for sign in with OAuth
oAuthCallbackPath?: stringSets path for OAuth sameWindow callback
oAuthWindowType?:string`Window type for Oauth authentication
oAuthWindowOptions?: { [key:string]: string }Set additional options to pass into window.open()

Global Options

OptionsDescription
headers?: { [key:string]: string; }Define custom global headers as hashmap. Be careful when overwriting the default options, devise token auth will refuse requests without the Content-Type-Header set

Further information on paths/routes can be found at devise token auth

Service Methods

Once initialized Angular2TokenService offers methods for session management.

.signIn()

The signIn method is used to sign in the user with email address and password. The optional parameter type specifies the name of UserType used for this session.

signIn({email: string, password: string, userType?: string}): Observable<Response>

Example:

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.signOut()

The signOut method destroys session and session storage.

signOut(): Observable<Response>

Example:

this._tokenService.signOut().subscribe(res=>console.log(res),error=>console.log(error));

.registerAccount()

Sends a new user registration request to the Server.

registerAccount({email: string, password: string, passwordConfirmation: string, userType?: string}): Observable<Response>

Example:

this._tokenService.registerAccount({email: 'example@example.org',password: 'secretPassword',passwordConfirmation: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.deleteAccount()

Deletes the account for the signed in user.

deleteAccount(): Observable<Response>

Example:

this._tokenService.deleteAccount().subscribe(res=>console.log(res),error=>console.log(error));

.validateToken()

Validates the current token with the server.

validateToken(): Observable<Response>

Example:

this._tokenService.validateToken().subscribe(res=>console.log(res),error=>console.log(error));

.updatePassword()

Updates the password for the logged in user.

updatePassword({password: string, passwordConfirmation: string, currentPassword?: string, userType?: string, resetPasswordToken?: string}): Observable<Response>

Example:

this._tokenService.updatePassword({password: 'newPassword',passwordConfirmation: 'newPassword',passwordCurrent: 'oldPassword',resetPasswordToken: 'resetPasswordToken',}).subscribe(res=>console.log(res),error=>console.log(error));

.resetPassword()

Request a password reset from the server.

resetPassword({email: string, userType?: string}): Observable<Response>

Example:

this._tokenService.resetPassword({email: 'example@example.org',}).subscribe(res=>console.log(res),error=>console.log(error));

.signInOAuth()

Initiates OAuth authentication flow. Currently, it supports two window modes: newWindow (default) and sameWindow (settable in config as oAuthWindowType).

  • When oAuthWindowType is set to newWindow, .signInOAuth() opens a new window and returns an observable.

  • When oAuthWindowType is set to sameWindow, .signInOAuth() returns nothing and redirects user to auth provider. After successful authentication, it redirects back to oAuthCallbackPath. Application router needs to intercept this route and call processOAuthCallback() to fetch AuthData from params.

signInOAuth(oAuthType: string)

Example:

this._tokenService.signInOAuth('github').subscribe(res=>console.log(res),error=>console.log(error));

.processOAuthCallback()

Fetches AuthData from params sent via OAuth redirection in sameWindow flow.

processOAuthCallback()

Example

Callback route:

RouterModule.forRoot([{path: 'oauth_callback',component: OauthCallbackComponent}])

Callback component:

@Component({template: ''})exportclassOauthCallbackComponentimplementsOnInit{constructor(private_tokenService: Angular2TokenService){}ngOnInit(){this._tokenService.processOAuthCallback();}}

HTTP Service Wrapper

Angular2TokenService wraps all standard Angular2 Http Service calls for authentication and token processing. If apiPath is configured it gets added in front of path.

  • get(url: string, options?: RequestOptionsArgs): Observable<Response>
  • post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • delete(url: string, options?: RequestOptionsArgs): Observable<Response>
  • patch(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • head(url: string, options?: RequestOptionsArgs): Observable<Response>
  • options(url: string, options?: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.get('my-resource/1').map(res=>res.json()).subscribe(res=>console.log(res),error=>console.log(error));

Multiple User Types

An array of UserType can be passed in Angular2TokenOptions during init(). The user type is selected during sign in and persists until sign out. .currentUserType returns the currently logged in user.

Example:

this._tokenService.init({userTypes: [{name: 'ADMIN',path: 'admin'},{name: 'USER',path: 'user'}]});this._tokenService.signIn({email: 'example@example.com',password: 'secretPassword',userType: 'ADMIN'})this._tokenService.currentUserType;// ADMIN

Route Guards

Angular2-Token implements the CanActivate interface, so it can directly be used as a route guard. If the signInRedirect option is set the user will be redirected on a failed (=false) CanActivate using Router.navigate(). It currently does not distinguish between user types.

Example:

constrouterConfig: Routes=[{path: '',component: PublicComponent},{path: 'restricted',component: RestrictedComponent,canActivate: [Angular2TokenService]}];

Advanced Usage

More advanced methods can be used if a higher degree of customization is required.

.request()

More customized requests can be send with the .request()-function. It accepts the RequestOptionsArgs-Interface. More information can be found in the Angular2 API Reference here.

request(options: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.request({method: RequestMethod.Post,url: 'my-resource/1',data: mydata});

.userSignedIn()

Returns true if a user is signed in. It does not distinguish between user types.

userSignedIn(): boolean

.currentUserType

Returns current user type as string like specified in the options.

get currentUserType(): string

.currentUserData

Returns current user data as returned by devise token auth. This variable is null after page reload until the .validateToken() call is answerd by the backend.

get currentUserData(): UserData

.currentAuthData

Returns current authentication data which are used to set auth headers.

get currentAuthData(): AuthData

.currentAuthHeaders

Returns current authentication data as an HTTP ready Header object.

get currentAuthHeaders(): Header

Redirect original requested URL

If you want to redirect to the protected URL after signing in, you need to set signInStoredUrlStorageKey and in your code you can do something like this

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>{// You have to add Router DI in your componentthis.router.navigateByUrl(localStorage.getItem('redirectTo'));},error=>console.log(error));

Common Problems

CORS Configuration

If you are using CORS in your Rails API make sure that Access-Control-Expose-Headers includes access-token, expiry, token-type, uid, and client. For the rack-cors gem this can be done by adding the following to its config. More information can be found here. ruby :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client']

Missing Routes

Make sure that your projects includes some kind of routing.

Development

If the package is installed from Github specified in the package.json, you need to build the package locally.

cd ./node_modules/angular2-token
npm install
npm run build

Testing

npm test

Credits

Test config files based on Angular2 Webpack Starter by AngularClass

License

The MIT License (see the LICENSE file for the full text)

About

🔑 Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo:

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hrangel/angular2-token: :key: Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo: · GitHub
Skip to content

Repository files navigation

Angular2-Token

Angular2-Token

Join the chat at https://gitter.im/lynndylanhurley/devise_token_authnpm versionnpm downloadsBuild StatusAngular 2 Style Guide

Token based authentication service for Angular2 with multiple user support. Angular2-Token works best with the devise token auth gem for Rails. Angular2-Token is currently in Alpha. Any contribution is much appreciated.

You can try out Angular2-Token here.

The repository can be found here.

Installation

  1. Install Angular2-Token via NPM with

    npm install angular2-token
  2. Import and add Angular2TokenService to your main module. Angular2TokenService depends on HttpModule and RouterModule, so make sure you import them too.

    import{Angular2TokenService}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})
  3. Inject Angular2TokenService into your main component and call .init().

    constructor(private_tokenService: Angular2TokenService){this._tokenService.init();}

Quickstart (αlpha)

Quickstart includes the necessary forms and routing to quickly use Angular2-Token with your Project. A live demo can be found here.

Quickstart is currently in αlpha, please use with caution.

Quickstart

  1. Add A2tUiModule to your main module.
    import{Angular2TokenService,A2tUiModule}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule,A2tUiModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})

The A2tUiModule adds the following routes to your project:

RouteDescription
session/sign-inSign in form
session/sign-upSign out form
session/reset-passwordReset password form
session/update-passwordUpdate password for email redirect

On successful sign in the user will be redirect to restricted.

Content

Configuration

Configuration options can be passed as Angular2TokenOptions via .init().

Default Configuration

constructor(private_tokenService: Angular2TokenService){this._tokenService.init({apiPath: null,signInPath: 'auth/sign_in',signInRedirect: null,signInStoredUrlStorageKey: null,signOutPath: 'auth/sign_out',validateTokenPath: 'auth/validate_token',signOutFailedValidate: false,registerAccountPath: 'auth',deleteAccountPath: 'auth',registerAccountCallback: window.location.href,updatePasswordPath: 'auth',resetPasswordPath: 'auth/password',resetPasswordCallback: window.location.href,oAuthHost: window.location.origin,oAuthPaths: {github: 'auth/github'},oAuthCallbackPath: 'oauth_callback',oAuthWindowType: 'newWindow',oAuthWindowOptions: null,userTypes: null,globalOptions: {headers: {'Content-Type': 'application/json','Accept': 'application/json'}}});}
OptionsDescription
apiBase?: stringSets the server for all API calls.
apiPath?: stringSets base path all operations are based on
signInPath?: stringSets path for sign in
signInRedirect?: stringSets redirect path for failed CanActivate
signInStoredUrlStorageKey?: stringSets locale storage key to store URL before displaying signIn page
signOutPath?: stringSets path for sign out
validateTokenPath?: stringSets path for token validation
signOutFailedValidate?: booleanSigns user out when validation returns a 401 status
registerAccountPath?: stringSets path for account registration
deleteAccountPath?: stringSets path for account deletion
registerAccountCallback?: stringSets the path user are redirected to after email confirmation for registration
updatePasswordPath?: stringSets path for password update
resetPasswordPath?: stringSets path for password reset
resetPasswordCallback?: stringSets the path user are redirected to after email confirmation for password reset
userTypes?: UserTypes[]Allows the configuration of multiple user types (see Multiple User Types)
globalOptions?: GlobalOptionsAllows the configuration of global options (see below)
oAuthBase?: stringConfigure the OAuth server (used for backends on a different url)
oAuthPaths?: { [key:string]: string }Sets paths for sign in with OAuth
oAuthCallbackPath?: stringSets path for OAuth sameWindow callback
oAuthWindowType?:string`Window type for Oauth authentication
oAuthWindowOptions?: { [key:string]: string }Set additional options to pass into window.open()

Global Options

OptionsDescription
headers?: { [key:string]: string; }Define custom global headers as hashmap. Be careful when overwriting the default options, devise token auth will refuse requests without the Content-Type-Header set

Further information on paths/routes can be found at devise token auth

Service Methods

Once initialized Angular2TokenService offers methods for session management.

.signIn()

The signIn method is used to sign in the user with email address and password. The optional parameter type specifies the name of UserType used for this session.

signIn({email: string, password: string, userType?: string}): Observable<Response>

Example:

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.signOut()

The signOut method destroys session and session storage.

signOut(): Observable<Response>

Example:

this._tokenService.signOut().subscribe(res=>console.log(res),error=>console.log(error));

.registerAccount()

Sends a new user registration request to the Server.

registerAccount({email: string, password: string, passwordConfirmation: string, userType?: string}): Observable<Response>

Example:

this._tokenService.registerAccount({email: 'example@example.org',password: 'secretPassword',passwordConfirmation: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.deleteAccount()

Deletes the account for the signed in user.

deleteAccount(): Observable<Response>

Example:

this._tokenService.deleteAccount().subscribe(res=>console.log(res),error=>console.log(error));

.validateToken()

Validates the current token with the server.

validateToken(): Observable<Response>

Example:

this._tokenService.validateToken().subscribe(res=>console.log(res),error=>console.log(error));

.updatePassword()

Updates the password for the logged in user.

updatePassword({password: string, passwordConfirmation: string, currentPassword?: string, userType?: string, resetPasswordToken?: string}): Observable<Response>

Example:

this._tokenService.updatePassword({password: 'newPassword',passwordConfirmation: 'newPassword',passwordCurrent: 'oldPassword',resetPasswordToken: 'resetPasswordToken',}).subscribe(res=>console.log(res),error=>console.log(error));

.resetPassword()

Request a password reset from the server.

resetPassword({email: string, userType?: string}): Observable<Response>

Example:

this._tokenService.resetPassword({email: 'example@example.org',}).subscribe(res=>console.log(res),error=>console.log(error));

.signInOAuth()

Initiates OAuth authentication flow. Currently, it supports two window modes: newWindow (default) and sameWindow (settable in config as oAuthWindowType).

  • When oAuthWindowType is set to newWindow, .signInOAuth() opens a new window and returns an observable.

  • When oAuthWindowType is set to sameWindow, .signInOAuth() returns nothing and redirects user to auth provider. After successful authentication, it redirects back to oAuthCallbackPath. Application router needs to intercept this route and call processOAuthCallback() to fetch AuthData from params.

signInOAuth(oAuthType: string)

Example:

this._tokenService.signInOAuth('github').subscribe(res=>console.log(res),error=>console.log(error));

.processOAuthCallback()

Fetches AuthData from params sent via OAuth redirection in sameWindow flow.

processOAuthCallback()

Example

Callback route:

RouterModule.forRoot([{path: 'oauth_callback',component: OauthCallbackComponent}])

Callback component:

@Component({template: ''})exportclassOauthCallbackComponentimplementsOnInit{constructor(private_tokenService: Angular2TokenService){}ngOnInit(){this._tokenService.processOAuthCallback();}}

HTTP Service Wrapper

Angular2TokenService wraps all standard Angular2 Http Service calls for authentication and token processing. If apiPath is configured it gets added in front of path.

  • get(url: string, options?: RequestOptionsArgs): Observable<Response>
  • post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • delete(url: string, options?: RequestOptionsArgs): Observable<Response>
  • patch(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • head(url: string, options?: RequestOptionsArgs): Observable<Response>
  • options(url: string, options?: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.get('my-resource/1').map(res=>res.json()).subscribe(res=>console.log(res),error=>console.log(error));

Multiple User Types

An array of UserType can be passed in Angular2TokenOptions during init(). The user type is selected during sign in and persists until sign out. .currentUserType returns the currently logged in user.

Example:

this._tokenService.init({userTypes: [{name: 'ADMIN',path: 'admin'},{name: 'USER',path: 'user'}]});this._tokenService.signIn({email: 'example@example.com',password: 'secretPassword',userType: 'ADMIN'})this._tokenService.currentUserType;// ADMIN

Route Guards

Angular2-Token implements the CanActivate interface, so it can directly be used as a route guard. If the signInRedirect option is set the user will be redirected on a failed (=false) CanActivate using Router.navigate(). It currently does not distinguish between user types.

Example:

constrouterConfig: Routes=[{path: '',component: PublicComponent},{path: 'restricted',component: RestrictedComponent,canActivate: [Angular2TokenService]}];

Advanced Usage

More advanced methods can be used if a higher degree of customization is required.

.request()

More customized requests can be send with the .request()-function. It accepts the RequestOptionsArgs-Interface. More information can be found in the Angular2 API Reference here.

request(options: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.request({method: RequestMethod.Post,url: 'my-resource/1',data: mydata});

.userSignedIn()

Returns true if a user is signed in. It does not distinguish between user types.

userSignedIn(): boolean

.currentUserType

Returns current user type as string like specified in the options.

get currentUserType(): string

.currentUserData

Returns current user data as returned by devise token auth. This variable is null after page reload until the .validateToken() call is answerd by the backend.

get currentUserData(): UserData

.currentAuthData

Returns current authentication data which are used to set auth headers.

get currentAuthData(): AuthData

.currentAuthHeaders

Returns current authentication data as an HTTP ready Header object.

get currentAuthHeaders(): Header

Redirect original requested URL

If you want to redirect to the protected URL after signing in, you need to set signInStoredUrlStorageKey and in your code you can do something like this

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>{// You have to add Router DI in your componentthis.router.navigateByUrl(localStorage.getItem('redirectTo'));},error=>console.log(error));

Common Problems

CORS Configuration

If you are using CORS in your Rails API make sure that Access-Control-Expose-Headers includes access-token, expiry, token-type, uid, and client. For the rack-cors gem this can be done by adding the following to its config. More information can be found here. ruby :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client']

Missing Routes

Make sure that your projects includes some kind of routing.

Development

If the package is installed from Github specified in the package.json, you need to build the package locally.

cd ./node_modules/angular2-token
npm install
npm run build

Testing

npm test

Credits

Test config files based on Angular2 Webpack Starter by AngularClass

License

The MIT License (see the LICENSE file for the full text)

About

🔑 Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo:

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hrangel/angular2-token: :key: Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo: · GitHub
Skip to content

Repository files navigation

Angular2-Token

Angular2-Token

Join the chat at https://gitter.im/lynndylanhurley/devise_token_authnpm versionnpm downloadsBuild StatusAngular 2 Style Guide

Token based authentication service for Angular2 with multiple user support. Angular2-Token works best with the devise token auth gem for Rails. Angular2-Token is currently in Alpha. Any contribution is much appreciated.

You can try out Angular2-Token here.

The repository can be found here.

Installation

  1. Install Angular2-Token via NPM with

    npm install angular2-token
  2. Import and add Angular2TokenService to your main module. Angular2TokenService depends on HttpModule and RouterModule, so make sure you import them too.

    import{Angular2TokenService}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})
  3. Inject Angular2TokenService into your main component and call .init().

    constructor(private_tokenService: Angular2TokenService){this._tokenService.init();}

Quickstart (αlpha)

Quickstart includes the necessary forms and routing to quickly use Angular2-Token with your Project. A live demo can be found here.

Quickstart is currently in αlpha, please use with caution.

Quickstart

  1. Add A2tUiModule to your main module.
    import{Angular2TokenService,A2tUiModule}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule,A2tUiModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})

The A2tUiModule adds the following routes to your project:

RouteDescription
session/sign-inSign in form
session/sign-upSign out form
session/reset-passwordReset password form
session/update-passwordUpdate password for email redirect

On successful sign in the user will be redirect to restricted.

Content

Configuration

Configuration options can be passed as Angular2TokenOptions via .init().

Default Configuration

constructor(private_tokenService: Angular2TokenService){this._tokenService.init({apiPath: null,signInPath: 'auth/sign_in',signInRedirect: null,signInStoredUrlStorageKey: null,signOutPath: 'auth/sign_out',validateTokenPath: 'auth/validate_token',signOutFailedValidate: false,registerAccountPath: 'auth',deleteAccountPath: 'auth',registerAccountCallback: window.location.href,updatePasswordPath: 'auth',resetPasswordPath: 'auth/password',resetPasswordCallback: window.location.href,oAuthHost: window.location.origin,oAuthPaths: {github: 'auth/github'},oAuthCallbackPath: 'oauth_callback',oAuthWindowType: 'newWindow',oAuthWindowOptions: null,userTypes: null,globalOptions: {headers: {'Content-Type': 'application/json','Accept': 'application/json'}}});}
OptionsDescription
apiBase?: stringSets the server for all API calls.
apiPath?: stringSets base path all operations are based on
signInPath?: stringSets path for sign in
signInRedirect?: stringSets redirect path for failed CanActivate
signInStoredUrlStorageKey?: stringSets locale storage key to store URL before displaying signIn page
signOutPath?: stringSets path for sign out
validateTokenPath?: stringSets path for token validation
signOutFailedValidate?: booleanSigns user out when validation returns a 401 status
registerAccountPath?: stringSets path for account registration
deleteAccountPath?: stringSets path for account deletion
registerAccountCallback?: stringSets the path user are redirected to after email confirmation for registration
updatePasswordPath?: stringSets path for password update
resetPasswordPath?: stringSets path for password reset
resetPasswordCallback?: stringSets the path user are redirected to after email confirmation for password reset
userTypes?: UserTypes[]Allows the configuration of multiple user types (see Multiple User Types)
globalOptions?: GlobalOptionsAllows the configuration of global options (see below)
oAuthBase?: stringConfigure the OAuth server (used for backends on a different url)
oAuthPaths?: { [key:string]: string }Sets paths for sign in with OAuth
oAuthCallbackPath?: stringSets path for OAuth sameWindow callback
oAuthWindowType?:string`Window type for Oauth authentication
oAuthWindowOptions?: { [key:string]: string }Set additional options to pass into window.open()

Global Options

OptionsDescription
headers?: { [key:string]: string; }Define custom global headers as hashmap. Be careful when overwriting the default options, devise token auth will refuse requests without the Content-Type-Header set

Further information on paths/routes can be found at devise token auth

Service Methods

Once initialized Angular2TokenService offers methods for session management.

.signIn()

The signIn method is used to sign in the user with email address and password. The optional parameter type specifies the name of UserType used for this session.

signIn({email: string, password: string, userType?: string}): Observable<Response>

Example:

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.signOut()

The signOut method destroys session and session storage.

signOut(): Observable<Response>

Example:

this._tokenService.signOut().subscribe(res=>console.log(res),error=>console.log(error));

.registerAccount()

Sends a new user registration request to the Server.

registerAccount({email: string, password: string, passwordConfirmation: string, userType?: string}): Observable<Response>

Example:

this._tokenService.registerAccount({email: 'example@example.org',password: 'secretPassword',passwordConfirmation: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.deleteAccount()

Deletes the account for the signed in user.

deleteAccount(): Observable<Response>

Example:

this._tokenService.deleteAccount().subscribe(res=>console.log(res),error=>console.log(error));

.validateToken()

Validates the current token with the server.

validateToken(): Observable<Response>

Example:

this._tokenService.validateToken().subscribe(res=>console.log(res),error=>console.log(error));

.updatePassword()

Updates the password for the logged in user.

updatePassword({password: string, passwordConfirmation: string, currentPassword?: string, userType?: string, resetPasswordToken?: string}): Observable<Response>

Example:

this._tokenService.updatePassword({password: 'newPassword',passwordConfirmation: 'newPassword',passwordCurrent: 'oldPassword',resetPasswordToken: 'resetPasswordToken',}).subscribe(res=>console.log(res),error=>console.log(error));

.resetPassword()

Request a password reset from the server.

resetPassword({email: string, userType?: string}): Observable<Response>

Example:

this._tokenService.resetPassword({email: 'example@example.org',}).subscribe(res=>console.log(res),error=>console.log(error));

.signInOAuth()

Initiates OAuth authentication flow. Currently, it supports two window modes: newWindow (default) and sameWindow (settable in config as oAuthWindowType).

  • When oAuthWindowType is set to newWindow, .signInOAuth() opens a new window and returns an observable.

  • When oAuthWindowType is set to sameWindow, .signInOAuth() returns nothing and redirects user to auth provider. After successful authentication, it redirects back to oAuthCallbackPath. Application router needs to intercept this route and call processOAuthCallback() to fetch AuthData from params.

signInOAuth(oAuthType: string)

Example:

this._tokenService.signInOAuth('github').subscribe(res=>console.log(res),error=>console.log(error));

.processOAuthCallback()

Fetches AuthData from params sent via OAuth redirection in sameWindow flow.

processOAuthCallback()

Example

Callback route:

RouterModule.forRoot([{path: 'oauth_callback',component: OauthCallbackComponent}])

Callback component:

@Component({template: ''})exportclassOauthCallbackComponentimplementsOnInit{constructor(private_tokenService: Angular2TokenService){}ngOnInit(){this._tokenService.processOAuthCallback();}}

HTTP Service Wrapper

Angular2TokenService wraps all standard Angular2 Http Service calls for authentication and token processing. If apiPath is configured it gets added in front of path.

  • get(url: string, options?: RequestOptionsArgs): Observable<Response>
  • post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • delete(url: string, options?: RequestOptionsArgs): Observable<Response>
  • patch(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • head(url: string, options?: RequestOptionsArgs): Observable<Response>
  • options(url: string, options?: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.get('my-resource/1').map(res=>res.json()).subscribe(res=>console.log(res),error=>console.log(error));

Multiple User Types

An array of UserType can be passed in Angular2TokenOptions during init(). The user type is selected during sign in and persists until sign out. .currentUserType returns the currently logged in user.

Example:

this._tokenService.init({userTypes: [{name: 'ADMIN',path: 'admin'},{name: 'USER',path: 'user'}]});this._tokenService.signIn({email: 'example@example.com',password: 'secretPassword',userType: 'ADMIN'})this._tokenService.currentUserType;// ADMIN

Route Guards

Angular2-Token implements the CanActivate interface, so it can directly be used as a route guard. If the signInRedirect option is set the user will be redirected on a failed (=false) CanActivate using Router.navigate(). It currently does not distinguish between user types.

Example:

constrouterConfig: Routes=[{path: '',component: PublicComponent},{path: 'restricted',component: RestrictedComponent,canActivate: [Angular2TokenService]}];

Advanced Usage

More advanced methods can be used if a higher degree of customization is required.

.request()

More customized requests can be send with the .request()-function. It accepts the RequestOptionsArgs-Interface. More information can be found in the Angular2 API Reference here.

request(options: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.request({method: RequestMethod.Post,url: 'my-resource/1',data: mydata});

.userSignedIn()

Returns true if a user is signed in. It does not distinguish between user types.

userSignedIn(): boolean

.currentUserType

Returns current user type as string like specified in the options.

get currentUserType(): string

.currentUserData

Returns current user data as returned by devise token auth. This variable is null after page reload until the .validateToken() call is answerd by the backend.

get currentUserData(): UserData

.currentAuthData

Returns current authentication data which are used to set auth headers.

get currentAuthData(): AuthData

.currentAuthHeaders

Returns current authentication data as an HTTP ready Header object.

get currentAuthHeaders(): Header

Redirect original requested URL

If you want to redirect to the protected URL after signing in, you need to set signInStoredUrlStorageKey and in your code you can do something like this

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>{// You have to add Router DI in your componentthis.router.navigateByUrl(localStorage.getItem('redirectTo'));},error=>console.log(error));

Common Problems

CORS Configuration

If you are using CORS in your Rails API make sure that Access-Control-Expose-Headers includes access-token, expiry, token-type, uid, and client. For the rack-cors gem this can be done by adding the following to its config. More information can be found here. ruby :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client']

Missing Routes

Make sure that your projects includes some kind of routing.

Development

If the package is installed from Github specified in the package.json, you need to build the package locally.

cd ./node_modules/angular2-token
npm install
npm run build

Testing

npm test

Credits

Test config files based on Angular2 Webpack Starter by AngularClass

License

The MIT License (see the LICENSE file for the full text)

About

🔑 Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo:

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - hrangel/angular2-token: :key: Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo: · GitHub
Skip to content

Repository files navigation

Angular2-Token

Angular2-Token

Join the chat at https://gitter.im/lynndylanhurley/devise_token_authnpm versionnpm downloadsBuild StatusAngular 2 Style Guide

Token based authentication service for Angular2 with multiple user support. Angular2-Token works best with the devise token auth gem for Rails. Angular2-Token is currently in Alpha. Any contribution is much appreciated.

You can try out Angular2-Token here.

The repository can be found here.

Installation

  1. Install Angular2-Token via NPM with

    npm install angular2-token
  2. Import and add Angular2TokenService to your main module. Angular2TokenService depends on HttpModule and RouterModule, so make sure you import them too.

    import{Angular2TokenService}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})
  3. Inject Angular2TokenService into your main component and call .init().

    constructor(private_tokenService: Angular2TokenService){this._tokenService.init();}

Quickstart (αlpha)

Quickstart includes the necessary forms and routing to quickly use Angular2-Token with your Project. A live demo can be found here.

Quickstart is currently in αlpha, please use with caution.

Quickstart

  1. Add A2tUiModule to your main module.
    import{Angular2TokenService,A2tUiModule}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule,A2tUiModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})

The A2tUiModule adds the following routes to your project:

RouteDescription
session/sign-inSign in form
session/sign-upSign out form
session/reset-passwordReset password form
session/update-passwordUpdate password for email redirect

On successful sign in the user will be redirect to restricted.

Content

Configuration

Configuration options can be passed as Angular2TokenOptions via .init().

Default Configuration

constructor(private_tokenService: Angular2TokenService){this._tokenService.init({apiPath: null,signInPath: 'auth/sign_in',signInRedirect: null,signInStoredUrlStorageKey: null,signOutPath: 'auth/sign_out',validateTokenPath: 'auth/validate_token',signOutFailedValidate: false,registerAccountPath: 'auth',deleteAccountPath: 'auth',registerAccountCallback: window.location.href,updatePasswordPath: 'auth',resetPasswordPath: 'auth/password',resetPasswordCallback: window.location.href,oAuthHost: window.location.origin,oAuthPaths: {github: 'auth/github'},oAuthCallbackPath: 'oauth_callback',oAuthWindowType: 'newWindow',oAuthWindowOptions: null,userTypes: null,globalOptions: {headers: {'Content-Type': 'application/json','Accept': 'application/json'}}});}
OptionsDescription
apiBase?: stringSets the server for all API calls.
apiPath?: stringSets base path all operations are based on
signInPath?: stringSets path for sign in
signInRedirect?: stringSets redirect path for failed CanActivate
signInStoredUrlStorageKey?: stringSets locale storage key to store URL before displaying signIn page
signOutPath?: stringSets path for sign out
validateTokenPath?: stringSets path for token validation
signOutFailedValidate?: booleanSigns user out when validation returns a 401 status
registerAccountPath?: stringSets path for account registration
deleteAccountPath?: stringSets path for account deletion
registerAccountCallback?: stringSets the path user are redirected to after email confirmation for registration
updatePasswordPath?: stringSets path for password update
resetPasswordPath?: stringSets path for password reset
resetPasswordCallback?: stringSets the path user are redirected to after email confirmation for password reset
userTypes?: UserTypes[]Allows the configuration of multiple user types (see Multiple User Types)
globalOptions?: GlobalOptionsAllows the configuration of global options (see below)
oAuthBase?: stringConfigure the OAuth server (used for backends on a different url)
oAuthPaths?: { [key:string]: string }Sets paths for sign in with OAuth
oAuthCallbackPath?: stringSets path for OAuth sameWindow callback
oAuthWindowType?:string`Window type for Oauth authentication
oAuthWindowOptions?: { [key:string]: string }Set additional options to pass into window.open()

Global Options

OptionsDescription
headers?: { [key:string]: string; }Define custom global headers as hashmap. Be careful when overwriting the default options, devise token auth will refuse requests without the Content-Type-Header set

Further information on paths/routes can be found at devise token auth

Service Methods

Once initialized Angular2TokenService offers methods for session management.

.signIn()

The signIn method is used to sign in the user with email address and password. The optional parameter type specifies the name of UserType used for this session.

signIn({email: string, password: string, userType?: string}): Observable<Response>

Example:

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.signOut()

The signOut method destroys session and session storage.

signOut(): Observable<Response>

Example:

this._tokenService.signOut().subscribe(res=>console.log(res),error=>console.log(error));

.registerAccount()

Sends a new user registration request to the Server.

registerAccount({email: string, password: string, passwordConfirmation: string, userType?: string}): Observable<Response>

Example:

this._tokenService.registerAccount({email: 'example@example.org',password: 'secretPassword',passwordConfirmation: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.deleteAccount()

Deletes the account for the signed in user.

deleteAccount(): Observable<Response>

Example:

this._tokenService.deleteAccount().subscribe(res=>console.log(res),error=>console.log(error));

.validateToken()

Validates the current token with the server.

validateToken(): Observable<Response>

Example:

this._tokenService.validateToken().subscribe(res=>console.log(res),error=>console.log(error));

.updatePassword()

Updates the password for the logged in user.

updatePassword({password: string, passwordConfirmation: string, currentPassword?: string, userType?: string, resetPasswordToken?: string}): Observable<Response>

Example:

this._tokenService.updatePassword({password: 'newPassword',passwordConfirmation: 'newPassword',passwordCurrent: 'oldPassword',resetPasswordToken: 'resetPasswordToken',}).subscribe(res=>console.log(res),error=>console.log(error));

.resetPassword()

Request a password reset from the server.

resetPassword({email: string, userType?: string}): Observable<Response>

Example:

this._tokenService.resetPassword({email: 'example@example.org',}).subscribe(res=>console.log(res),error=>console.log(error));

.signInOAuth()

Initiates OAuth authentication flow. Currently, it supports two window modes: newWindow (default) and sameWindow (settable in config as oAuthWindowType).

  • When oAuthWindowType is set to newWindow, .signInOAuth() opens a new window and returns an observable.

  • When oAuthWindowType is set to sameWindow, .signInOAuth() returns nothing and redirects user to auth provider. After successful authentication, it redirects back to oAuthCallbackPath. Application router needs to intercept this route and call processOAuthCallback() to fetch AuthData from params.

signInOAuth(oAuthType: string)

Example:

this._tokenService.signInOAuth('github').subscribe(res=>console.log(res),error=>console.log(error));

.processOAuthCallback()

Fetches AuthData from params sent via OAuth redirection in sameWindow flow.

processOAuthCallback()

Example

Callback route:

RouterModule.forRoot([{path: 'oauth_callback',component: OauthCallbackComponent}])

Callback component:

@Component({template: ''})exportclassOauthCallbackComponentimplementsOnInit{constructor(private_tokenService: Angular2TokenService){}ngOnInit(){this._tokenService.processOAuthCallback();}}

HTTP Service Wrapper

Angular2TokenService wraps all standard Angular2 Http Service calls for authentication and token processing. If apiPath is configured it gets added in front of path.

  • get(url: string, options?: RequestOptionsArgs): Observable<Response>
  • post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • delete(url: string, options?: RequestOptionsArgs): Observable<Response>
  • patch(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • head(url: string, options?: RequestOptionsArgs): Observable<Response>
  • options(url: string, options?: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.get('my-resource/1').map(res=>res.json()).subscribe(res=>console.log(res),error=>console.log(error));

Multiple User Types

An array of UserType can be passed in Angular2TokenOptions during init(). The user type is selected during sign in and persists until sign out. .currentUserType returns the currently logged in user.

Example:

this._tokenService.init({userTypes: [{name: 'ADMIN',path: 'admin'},{name: 'USER',path: 'user'}]});this._tokenService.signIn({email: 'example@example.com',password: 'secretPassword',userType: 'ADMIN'})this._tokenService.currentUserType;// ADMIN

Route Guards

Angular2-Token implements the CanActivate interface, so it can directly be used as a route guard. If the signInRedirect option is set the user will be redirected on a failed (=false) CanActivate using Router.navigate(). It currently does not distinguish between user types.

Example:

constrouterConfig: Routes=[{path: '',component: PublicComponent},{path: 'restricted',component: RestrictedComponent,canActivate: [Angular2TokenService]}];

Advanced Usage

More advanced methods can be used if a higher degree of customization is required.

.request()

More customized requests can be send with the .request()-function. It accepts the RequestOptionsArgs-Interface. More information can be found in the Angular2 API Reference here.

request(options: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.request({method: RequestMethod.Post,url: 'my-resource/1',data: mydata});

.userSignedIn()

Returns true if a user is signed in. It does not distinguish between user types.

userSignedIn(): boolean

.currentUserType

Returns current user type as string like specified in the options.

get currentUserType(): string

.currentUserData

Returns current user data as returned by devise token auth. This variable is null after page reload until the .validateToken() call is answerd by the backend.

get currentUserData(): UserData

.currentAuthData

Returns current authentication data which are used to set auth headers.

get currentAuthData(): AuthData

.currentAuthHeaders

Returns current authentication data as an HTTP ready Header object.

get currentAuthHeaders(): Header

Redirect original requested URL

If you want to redirect to the protected URL after signing in, you need to set signInStoredUrlStorageKey and in your code you can do something like this

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>{// You have to add Router DI in your componentthis.router.navigateByUrl(localStorage.getItem('redirectTo'));},error=>console.log(error));

Common Problems

CORS Configuration

If you are using CORS in your Rails API make sure that Access-Control-Expose-Headers includes access-token, expiry, token-type, uid, and client. For the rack-cors gem this can be done by adding the following to its config. More information can be found here. ruby :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client']

Missing Routes

Make sure that your projects includes some kind of routing.

Development

If the package is installed from Github specified in the package.json, you need to build the package locally.

cd ./node_modules/angular2-token
npm install
npm run build

Testing

npm test

Credits

Test config files based on Angular2 Webpack Starter by AngularClass

License

The MIT License (see the LICENSE file for the full text)

About

🔑 Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo:

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hrangel/angular2-token: :key: Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo: · GitHub
Skip to content

Repository files navigation

Angular2-Token

Angular2-Token

Join the chat at https://gitter.im/lynndylanhurley/devise_token_authnpm versionnpm downloadsBuild StatusAngular 2 Style Guide

Token based authentication service for Angular2 with multiple user support. Angular2-Token works best with the devise token auth gem for Rails. Angular2-Token is currently in Alpha. Any contribution is much appreciated.

You can try out Angular2-Token here.

The repository can be found here.

Installation

  1. Install Angular2-Token via NPM with

    npm install angular2-token
  2. Import and add Angular2TokenService to your main module. Angular2TokenService depends on HttpModule and RouterModule, so make sure you import them too.

    import{Angular2TokenService}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})
  3. Inject Angular2TokenService into your main component and call .init().

    constructor(private_tokenService: Angular2TokenService){this._tokenService.init();}

Quickstart (αlpha)

Quickstart includes the necessary forms and routing to quickly use Angular2-Token with your Project. A live demo can be found here.

Quickstart is currently in αlpha, please use with caution.

Quickstart

  1. Add A2tUiModule to your main module.
    import{Angular2TokenService,A2tUiModule}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule,A2tUiModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})

The A2tUiModule adds the following routes to your project:

RouteDescription
session/sign-inSign in form
session/sign-upSign out form
session/reset-passwordReset password form
session/update-passwordUpdate password for email redirect

On successful sign in the user will be redirect to restricted.

Content

Configuration

Configuration options can be passed as Angular2TokenOptions via .init().

Default Configuration

constructor(private_tokenService: Angular2TokenService){this._tokenService.init({apiPath: null,signInPath: 'auth/sign_in',signInRedirect: null,signInStoredUrlStorageKey: null,signOutPath: 'auth/sign_out',validateTokenPath: 'auth/validate_token',signOutFailedValidate: false,registerAccountPath: 'auth',deleteAccountPath: 'auth',registerAccountCallback: window.location.href,updatePasswordPath: 'auth',resetPasswordPath: 'auth/password',resetPasswordCallback: window.location.href,oAuthHost: window.location.origin,oAuthPaths: {github: 'auth/github'},oAuthCallbackPath: 'oauth_callback',oAuthWindowType: 'newWindow',oAuthWindowOptions: null,userTypes: null,globalOptions: {headers: {'Content-Type': 'application/json','Accept': 'application/json'}}});}
OptionsDescription
apiBase?: stringSets the server for all API calls.
apiPath?: stringSets base path all operations are based on
signInPath?: stringSets path for sign in
signInRedirect?: stringSets redirect path for failed CanActivate
signInStoredUrlStorageKey?: stringSets locale storage key to store URL before displaying signIn page
signOutPath?: stringSets path for sign out
validateTokenPath?: stringSets path for token validation
signOutFailedValidate?: booleanSigns user out when validation returns a 401 status
registerAccountPath?: stringSets path for account registration
deleteAccountPath?: stringSets path for account deletion
registerAccountCallback?: stringSets the path user are redirected to after email confirmation for registration
updatePasswordPath?: stringSets path for password update
resetPasswordPath?: stringSets path for password reset
resetPasswordCallback?: stringSets the path user are redirected to after email confirmation for password reset
userTypes?: UserTypes[]Allows the configuration of multiple user types (see Multiple User Types)
globalOptions?: GlobalOptionsAllows the configuration of global options (see below)
oAuthBase?: stringConfigure the OAuth server (used for backends on a different url)
oAuthPaths?: { [key:string]: string }Sets paths for sign in with OAuth
oAuthCallbackPath?: stringSets path for OAuth sameWindow callback
oAuthWindowType?:string`Window type for Oauth authentication
oAuthWindowOptions?: { [key:string]: string }Set additional options to pass into window.open()

Global Options

OptionsDescription
headers?: { [key:string]: string; }Define custom global headers as hashmap. Be careful when overwriting the default options, devise token auth will refuse requests without the Content-Type-Header set

Further information on paths/routes can be found at devise token auth

Service Methods

Once initialized Angular2TokenService offers methods for session management.

.signIn()

The signIn method is used to sign in the user with email address and password. The optional parameter type specifies the name of UserType used for this session.

signIn({email: string, password: string, userType?: string}): Observable<Response>

Example:

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.signOut()

The signOut method destroys session and session storage.

signOut(): Observable<Response>

Example:

this._tokenService.signOut().subscribe(res=>console.log(res),error=>console.log(error));

.registerAccount()

Sends a new user registration request to the Server.

registerAccount({email: string, password: string, passwordConfirmation: string, userType?: string}): Observable<Response>

Example:

this._tokenService.registerAccount({email: 'example@example.org',password: 'secretPassword',passwordConfirmation: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.deleteAccount()

Deletes the account for the signed in user.

deleteAccount(): Observable<Response>

Example:

this._tokenService.deleteAccount().subscribe(res=>console.log(res),error=>console.log(error));

.validateToken()

Validates the current token with the server.

validateToken(): Observable<Response>

Example:

this._tokenService.validateToken().subscribe(res=>console.log(res),error=>console.log(error));

.updatePassword()

Updates the password for the logged in user.

updatePassword({password: string, passwordConfirmation: string, currentPassword?: string, userType?: string, resetPasswordToken?: string}): Observable<Response>

Example:

this._tokenService.updatePassword({password: 'newPassword',passwordConfirmation: 'newPassword',passwordCurrent: 'oldPassword',resetPasswordToken: 'resetPasswordToken',}).subscribe(res=>console.log(res),error=>console.log(error));

.resetPassword()

Request a password reset from the server.

resetPassword({email: string, userType?: string}): Observable<Response>

Example:

this._tokenService.resetPassword({email: 'example@example.org',}).subscribe(res=>console.log(res),error=>console.log(error));

.signInOAuth()

Initiates OAuth authentication flow. Currently, it supports two window modes: newWindow (default) and sameWindow (settable in config as oAuthWindowType).

  • When oAuthWindowType is set to newWindow, .signInOAuth() opens a new window and returns an observable.

  • When oAuthWindowType is set to sameWindow, .signInOAuth() returns nothing and redirects user to auth provider. After successful authentication, it redirects back to oAuthCallbackPath. Application router needs to intercept this route and call processOAuthCallback() to fetch AuthData from params.

signInOAuth(oAuthType: string)

Example:

this._tokenService.signInOAuth('github').subscribe(res=>console.log(res),error=>console.log(error));

.processOAuthCallback()

Fetches AuthData from params sent via OAuth redirection in sameWindow flow.

processOAuthCallback()

Example

Callback route:

RouterModule.forRoot([{path: 'oauth_callback',component: OauthCallbackComponent}])

Callback component:

@Component({template: ''})exportclassOauthCallbackComponentimplementsOnInit{constructor(private_tokenService: Angular2TokenService){}ngOnInit(){this._tokenService.processOAuthCallback();}}

HTTP Service Wrapper

Angular2TokenService wraps all standard Angular2 Http Service calls for authentication and token processing. If apiPath is configured it gets added in front of path.

  • get(url: string, options?: RequestOptionsArgs): Observable<Response>
  • post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • delete(url: string, options?: RequestOptionsArgs): Observable<Response>
  • patch(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • head(url: string, options?: RequestOptionsArgs): Observable<Response>
  • options(url: string, options?: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.get('my-resource/1').map(res=>res.json()).subscribe(res=>console.log(res),error=>console.log(error));

Multiple User Types

An array of UserType can be passed in Angular2TokenOptions during init(). The user type is selected during sign in and persists until sign out. .currentUserType returns the currently logged in user.

Example:

this._tokenService.init({userTypes: [{name: 'ADMIN',path: 'admin'},{name: 'USER',path: 'user'}]});this._tokenService.signIn({email: 'example@example.com',password: 'secretPassword',userType: 'ADMIN'})this._tokenService.currentUserType;// ADMIN

Route Guards

Angular2-Token implements the CanActivate interface, so it can directly be used as a route guard. If the signInRedirect option is set the user will be redirected on a failed (=false) CanActivate using Router.navigate(). It currently does not distinguish between user types.

Example:

constrouterConfig: Routes=[{path: '',component: PublicComponent},{path: 'restricted',component: RestrictedComponent,canActivate: [Angular2TokenService]}];

Advanced Usage

More advanced methods can be used if a higher degree of customization is required.

.request()

More customized requests can be send with the .request()-function. It accepts the RequestOptionsArgs-Interface. More information can be found in the Angular2 API Reference here.

request(options: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.request({method: RequestMethod.Post,url: 'my-resource/1',data: mydata});

.userSignedIn()

Returns true if a user is signed in. It does not distinguish between user types.

userSignedIn(): boolean

.currentUserType

Returns current user type as string like specified in the options.

get currentUserType(): string

.currentUserData

Returns current user data as returned by devise token auth. This variable is null after page reload until the .validateToken() call is answerd by the backend.

get currentUserData(): UserData

.currentAuthData

Returns current authentication data which are used to set auth headers.

get currentAuthData(): AuthData

.currentAuthHeaders

Returns current authentication data as an HTTP ready Header object.

get currentAuthHeaders(): Header

Redirect original requested URL

If you want to redirect to the protected URL after signing in, you need to set signInStoredUrlStorageKey and in your code you can do something like this

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>{// You have to add Router DI in your componentthis.router.navigateByUrl(localStorage.getItem('redirectTo'));},error=>console.log(error));

Common Problems

CORS Configuration

If you are using CORS in your Rails API make sure that Access-Control-Expose-Headers includes access-token, expiry, token-type, uid, and client. For the rack-cors gem this can be done by adding the following to its config. More information can be found here. ruby :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client']

Missing Routes

Make sure that your projects includes some kind of routing.

Development

If the package is installed from Github specified in the package.json, you need to build the package locally.

cd ./node_modules/angular2-token
npm install
npm run build

Testing

npm test

Credits

Test config files based on Angular2 Webpack Starter by AngularClass

License

The MIT License (see the LICENSE file for the full text)

About

🔑 Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo:

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - hrangel/angular2-token: :key: Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo: · GitHub
Skip to content

Repository files navigation

Angular2-Token

Angular2-Token

Join the chat at https://gitter.im/lynndylanhurley/devise_token_authnpm versionnpm downloadsBuild StatusAngular 2 Style Guide

Token based authentication service for Angular2 with multiple user support. Angular2-Token works best with the devise token auth gem for Rails. Angular2-Token is currently in Alpha. Any contribution is much appreciated.

You can try out Angular2-Token here.

The repository can be found here.

Installation

  1. Install Angular2-Token via NPM with

    npm install angular2-token
  2. Import and add Angular2TokenService to your main module. Angular2TokenService depends on HttpModule and RouterModule, so make sure you import them too.

    import{Angular2TokenService}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})
  3. Inject Angular2TokenService into your main component and call .init().

    constructor(private_tokenService: Angular2TokenService){this._tokenService.init();}

Quickstart (αlpha)

Quickstart includes the necessary forms and routing to quickly use Angular2-Token with your Project. A live demo can be found here.

Quickstart is currently in αlpha, please use with caution.

Quickstart

  1. Add A2tUiModule to your main module.
    import{Angular2TokenService,A2tUiModule}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule,A2tUiModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})

The A2tUiModule adds the following routes to your project:

RouteDescription
session/sign-inSign in form
session/sign-upSign out form
session/reset-passwordReset password form
session/update-passwordUpdate password for email redirect

On successful sign in the user will be redirect to restricted.

Content

Configuration

Configuration options can be passed as Angular2TokenOptions via .init().

Default Configuration

constructor(private_tokenService: Angular2TokenService){this._tokenService.init({apiPath: null,signInPath: 'auth/sign_in',signInRedirect: null,signInStoredUrlStorageKey: null,signOutPath: 'auth/sign_out',validateTokenPath: 'auth/validate_token',signOutFailedValidate: false,registerAccountPath: 'auth',deleteAccountPath: 'auth',registerAccountCallback: window.location.href,updatePasswordPath: 'auth',resetPasswordPath: 'auth/password',resetPasswordCallback: window.location.href,oAuthHost: window.location.origin,oAuthPaths: {github: 'auth/github'},oAuthCallbackPath: 'oauth_callback',oAuthWindowType: 'newWindow',oAuthWindowOptions: null,userTypes: null,globalOptions: {headers: {'Content-Type': 'application/json','Accept': 'application/json'}}});}
OptionsDescription
apiBase?: stringSets the server for all API calls.
apiPath?: stringSets base path all operations are based on
signInPath?: stringSets path for sign in
signInRedirect?: stringSets redirect path for failed CanActivate
signInStoredUrlStorageKey?: stringSets locale storage key to store URL before displaying signIn page
signOutPath?: stringSets path for sign out
validateTokenPath?: stringSets path for token validation
signOutFailedValidate?: booleanSigns user out when validation returns a 401 status
registerAccountPath?: stringSets path for account registration
deleteAccountPath?: stringSets path for account deletion
registerAccountCallback?: stringSets the path user are redirected to after email confirmation for registration
updatePasswordPath?: stringSets path for password update
resetPasswordPath?: stringSets path for password reset
resetPasswordCallback?: stringSets the path user are redirected to after email confirmation for password reset
userTypes?: UserTypes[]Allows the configuration of multiple user types (see Multiple User Types)
globalOptions?: GlobalOptionsAllows the configuration of global options (see below)
oAuthBase?: stringConfigure the OAuth server (used for backends on a different url)
oAuthPaths?: { [key:string]: string }Sets paths for sign in with OAuth
oAuthCallbackPath?: stringSets path for OAuth sameWindow callback
oAuthWindowType?:string`Window type for Oauth authentication
oAuthWindowOptions?: { [key:string]: string }Set additional options to pass into window.open()

Global Options

OptionsDescription
headers?: { [key:string]: string; }Define custom global headers as hashmap. Be careful when overwriting the default options, devise token auth will refuse requests without the Content-Type-Header set

Further information on paths/routes can be found at devise token auth

Service Methods

Once initialized Angular2TokenService offers methods for session management.

.signIn()

The signIn method is used to sign in the user with email address and password. The optional parameter type specifies the name of UserType used for this session.

signIn({email: string, password: string, userType?: string}): Observable<Response>

Example:

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.signOut()

The signOut method destroys session and session storage.

signOut(): Observable<Response>

Example:

this._tokenService.signOut().subscribe(res=>console.log(res),error=>console.log(error));

.registerAccount()

Sends a new user registration request to the Server.

registerAccount({email: string, password: string, passwordConfirmation: string, userType?: string}): Observable<Response>

Example:

this._tokenService.registerAccount({email: 'example@example.org',password: 'secretPassword',passwordConfirmation: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.deleteAccount()

Deletes the account for the signed in user.

deleteAccount(): Observable<Response>

Example:

this._tokenService.deleteAccount().subscribe(res=>console.log(res),error=>console.log(error));

.validateToken()

Validates the current token with the server.

validateToken(): Observable<Response>

Example:

this._tokenService.validateToken().subscribe(res=>console.log(res),error=>console.log(error));

.updatePassword()

Updates the password for the logged in user.

updatePassword({password: string, passwordConfirmation: string, currentPassword?: string, userType?: string, resetPasswordToken?: string}): Observable<Response>

Example:

this._tokenService.updatePassword({password: 'newPassword',passwordConfirmation: 'newPassword',passwordCurrent: 'oldPassword',resetPasswordToken: 'resetPasswordToken',}).subscribe(res=>console.log(res),error=>console.log(error));

.resetPassword()

Request a password reset from the server.

resetPassword({email: string, userType?: string}): Observable<Response>

Example:

this._tokenService.resetPassword({email: 'example@example.org',}).subscribe(res=>console.log(res),error=>console.log(error));

.signInOAuth()

Initiates OAuth authentication flow. Currently, it supports two window modes: newWindow (default) and sameWindow (settable in config as oAuthWindowType).

  • When oAuthWindowType is set to newWindow, .signInOAuth() opens a new window and returns an observable.

  • When oAuthWindowType is set to sameWindow, .signInOAuth() returns nothing and redirects user to auth provider. After successful authentication, it redirects back to oAuthCallbackPath. Application router needs to intercept this route and call processOAuthCallback() to fetch AuthData from params.

signInOAuth(oAuthType: string)

Example:

this._tokenService.signInOAuth('github').subscribe(res=>console.log(res),error=>console.log(error));

.processOAuthCallback()

Fetches AuthData from params sent via OAuth redirection in sameWindow flow.

processOAuthCallback()

Example

Callback route:

RouterModule.forRoot([{path: 'oauth_callback',component: OauthCallbackComponent}])

Callback component:

@Component({template: ''})exportclassOauthCallbackComponentimplementsOnInit{constructor(private_tokenService: Angular2TokenService){}ngOnInit(){this._tokenService.processOAuthCallback();}}

HTTP Service Wrapper

Angular2TokenService wraps all standard Angular2 Http Service calls for authentication and token processing. If apiPath is configured it gets added in front of path.

  • get(url: string, options?: RequestOptionsArgs): Observable<Response>
  • post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • delete(url: string, options?: RequestOptionsArgs): Observable<Response>
  • patch(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • head(url: string, options?: RequestOptionsArgs): Observable<Response>
  • options(url: string, options?: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.get('my-resource/1').map(res=>res.json()).subscribe(res=>console.log(res),error=>console.log(error));

Multiple User Types

An array of UserType can be passed in Angular2TokenOptions during init(). The user type is selected during sign in and persists until sign out. .currentUserType returns the currently logged in user.

Example:

this._tokenService.init({userTypes: [{name: 'ADMIN',path: 'admin'},{name: 'USER',path: 'user'}]});this._tokenService.signIn({email: 'example@example.com',password: 'secretPassword',userType: 'ADMIN'})this._tokenService.currentUserType;// ADMIN

Route Guards

Angular2-Token implements the CanActivate interface, so it can directly be used as a route guard. If the signInRedirect option is set the user will be redirected on a failed (=false) CanActivate using Router.navigate(). It currently does not distinguish between user types.

Example:

constrouterConfig: Routes=[{path: '',component: PublicComponent},{path: 'restricted',component: RestrictedComponent,canActivate: [Angular2TokenService]}];

Advanced Usage

More advanced methods can be used if a higher degree of customization is required.

.request()

More customized requests can be send with the .request()-function. It accepts the RequestOptionsArgs-Interface. More information can be found in the Angular2 API Reference here.

request(options: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.request({method: RequestMethod.Post,url: 'my-resource/1',data: mydata});

.userSignedIn()

Returns true if a user is signed in. It does not distinguish between user types.

userSignedIn(): boolean

.currentUserType

Returns current user type as string like specified in the options.

get currentUserType(): string

.currentUserData

Returns current user data as returned by devise token auth. This variable is null after page reload until the .validateToken() call is answerd by the backend.

get currentUserData(): UserData

.currentAuthData

Returns current authentication data which are used to set auth headers.

get currentAuthData(): AuthData

.currentAuthHeaders

Returns current authentication data as an HTTP ready Header object.

get currentAuthHeaders(): Header

Redirect original requested URL

If you want to redirect to the protected URL after signing in, you need to set signInStoredUrlStorageKey and in your code you can do something like this

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>{// You have to add Router DI in your componentthis.router.navigateByUrl(localStorage.getItem('redirectTo'));},error=>console.log(error));

Common Problems

CORS Configuration

If you are using CORS in your Rails API make sure that Access-Control-Expose-Headers includes access-token, expiry, token-type, uid, and client. For the rack-cors gem this can be done by adding the following to its config. More information can be found here. ruby :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client']

Missing Routes

Make sure that your projects includes some kind of routing.

Development

If the package is installed from Github specified in the package.json, you need to build the package locally.

cd ./node_modules/angular2-token
npm install
npm run build

Testing

npm test

Credits

Test config files based on Angular2 Webpack Starter by AngularClass

License

The MIT License (see the LICENSE file for the full text)

About

🔑 Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo:

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - hrangel/angular2-token: :key: Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo: · GitHub
Skip to content

Repository files navigation

Angular2-Token

Angular2-Token

Join the chat at https://gitter.im/lynndylanhurley/devise_token_authnpm versionnpm downloadsBuild StatusAngular 2 Style Guide

Token based authentication service for Angular2 with multiple user support. Angular2-Token works best with the devise token auth gem for Rails. Angular2-Token is currently in Alpha. Any contribution is much appreciated.

You can try out Angular2-Token here.

The repository can be found here.

Installation

  1. Install Angular2-Token via NPM with

    npm install angular2-token
  2. Import and add Angular2TokenService to your main module. Angular2TokenService depends on HttpModule and RouterModule, so make sure you import them too.

    import{Angular2TokenService}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})
  3. Inject Angular2TokenService into your main component and call .init().

    constructor(private_tokenService: Angular2TokenService){this._tokenService.init();}

Quickstart (αlpha)

Quickstart includes the necessary forms and routing to quickly use Angular2-Token with your Project. A live demo can be found here.

Quickstart is currently in αlpha, please use with caution.

Quickstart

  1. Add A2tUiModule to your main module.
    import{Angular2TokenService,A2tUiModule}from'angular2-token';
    @NgModule({imports: [BrowserModule,HttpModule,RouterModule,A2tUiModule],declarations: [AppComponent],providers: [Angular2TokenService],bootstrap: [AppComponent]})

The A2tUiModule adds the following routes to your project:

RouteDescription
session/sign-inSign in form
session/sign-upSign out form
session/reset-passwordReset password form
session/update-passwordUpdate password for email redirect

On successful sign in the user will be redirect to restricted.

Content

Configuration

Configuration options can be passed as Angular2TokenOptions via .init().

Default Configuration

constructor(private_tokenService: Angular2TokenService){this._tokenService.init({apiPath: null,signInPath: 'auth/sign_in',signInRedirect: null,signInStoredUrlStorageKey: null,signOutPath: 'auth/sign_out',validateTokenPath: 'auth/validate_token',signOutFailedValidate: false,registerAccountPath: 'auth',deleteAccountPath: 'auth',registerAccountCallback: window.location.href,updatePasswordPath: 'auth',resetPasswordPath: 'auth/password',resetPasswordCallback: window.location.href,oAuthHost: window.location.origin,oAuthPaths: {github: 'auth/github'},oAuthCallbackPath: 'oauth_callback',oAuthWindowType: 'newWindow',oAuthWindowOptions: null,userTypes: null,globalOptions: {headers: {'Content-Type': 'application/json','Accept': 'application/json'}}});}
OptionsDescription
apiBase?: stringSets the server for all API calls.
apiPath?: stringSets base path all operations are based on
signInPath?: stringSets path for sign in
signInRedirect?: stringSets redirect path for failed CanActivate
signInStoredUrlStorageKey?: stringSets locale storage key to store URL before displaying signIn page
signOutPath?: stringSets path for sign out
validateTokenPath?: stringSets path for token validation
signOutFailedValidate?: booleanSigns user out when validation returns a 401 status
registerAccountPath?: stringSets path for account registration
deleteAccountPath?: stringSets path for account deletion
registerAccountCallback?: stringSets the path user are redirected to after email confirmation for registration
updatePasswordPath?: stringSets path for password update
resetPasswordPath?: stringSets path for password reset
resetPasswordCallback?: stringSets the path user are redirected to after email confirmation for password reset
userTypes?: UserTypes[]Allows the configuration of multiple user types (see Multiple User Types)
globalOptions?: GlobalOptionsAllows the configuration of global options (see below)
oAuthBase?: stringConfigure the OAuth server (used for backends on a different url)
oAuthPaths?: { [key:string]: string }Sets paths for sign in with OAuth
oAuthCallbackPath?: stringSets path for OAuth sameWindow callback
oAuthWindowType?:string`Window type for Oauth authentication
oAuthWindowOptions?: { [key:string]: string }Set additional options to pass into window.open()

Global Options

OptionsDescription
headers?: { [key:string]: string; }Define custom global headers as hashmap. Be careful when overwriting the default options, devise token auth will refuse requests without the Content-Type-Header set

Further information on paths/routes can be found at devise token auth

Service Methods

Once initialized Angular2TokenService offers methods for session management.

.signIn()

The signIn method is used to sign in the user with email address and password. The optional parameter type specifies the name of UserType used for this session.

signIn({email: string, password: string, userType?: string}): Observable<Response>

Example:

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.signOut()

The signOut method destroys session and session storage.

signOut(): Observable<Response>

Example:

this._tokenService.signOut().subscribe(res=>console.log(res),error=>console.log(error));

.registerAccount()

Sends a new user registration request to the Server.

registerAccount({email: string, password: string, passwordConfirmation: string, userType?: string}): Observable<Response>

Example:

this._tokenService.registerAccount({email: 'example@example.org',password: 'secretPassword',passwordConfirmation: 'secretPassword'}).subscribe(res=>console.log(res),error=>console.log(error));

.deleteAccount()

Deletes the account for the signed in user.

deleteAccount(): Observable<Response>

Example:

this._tokenService.deleteAccount().subscribe(res=>console.log(res),error=>console.log(error));

.validateToken()

Validates the current token with the server.

validateToken(): Observable<Response>

Example:

this._tokenService.validateToken().subscribe(res=>console.log(res),error=>console.log(error));

.updatePassword()

Updates the password for the logged in user.

updatePassword({password: string, passwordConfirmation: string, currentPassword?: string, userType?: string, resetPasswordToken?: string}): Observable<Response>

Example:

this._tokenService.updatePassword({password: 'newPassword',passwordConfirmation: 'newPassword',passwordCurrent: 'oldPassword',resetPasswordToken: 'resetPasswordToken',}).subscribe(res=>console.log(res),error=>console.log(error));

.resetPassword()

Request a password reset from the server.

resetPassword({email: string, userType?: string}): Observable<Response>

Example:

this._tokenService.resetPassword({email: 'example@example.org',}).subscribe(res=>console.log(res),error=>console.log(error));

.signInOAuth()

Initiates OAuth authentication flow. Currently, it supports two window modes: newWindow (default) and sameWindow (settable in config as oAuthWindowType).

  • When oAuthWindowType is set to newWindow, .signInOAuth() opens a new window and returns an observable.

  • When oAuthWindowType is set to sameWindow, .signInOAuth() returns nothing and redirects user to auth provider. After successful authentication, it redirects back to oAuthCallbackPath. Application router needs to intercept this route and call processOAuthCallback() to fetch AuthData from params.

signInOAuth(oAuthType: string)

Example:

this._tokenService.signInOAuth('github').subscribe(res=>console.log(res),error=>console.log(error));

.processOAuthCallback()

Fetches AuthData from params sent via OAuth redirection in sameWindow flow.

processOAuthCallback()

Example

Callback route:

RouterModule.forRoot([{path: 'oauth_callback',component: OauthCallbackComponent}])

Callback component:

@Component({template: ''})exportclassOauthCallbackComponentimplementsOnInit{constructor(private_tokenService: Angular2TokenService){}ngOnInit(){this._tokenService.processOAuthCallback();}}

HTTP Service Wrapper

Angular2TokenService wraps all standard Angular2 Http Service calls for authentication and token processing. If apiPath is configured it gets added in front of path.

  • get(url: string, options?: RequestOptionsArgs): Observable<Response>
  • post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • delete(url: string, options?: RequestOptionsArgs): Observable<Response>
  • patch(url: string, body: any, options?: RequestOptionsArgs): Observable<Response>
  • head(url: string, options?: RequestOptionsArgs): Observable<Response>
  • options(url: string, options?: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.get('my-resource/1').map(res=>res.json()).subscribe(res=>console.log(res),error=>console.log(error));

Multiple User Types

An array of UserType can be passed in Angular2TokenOptions during init(). The user type is selected during sign in and persists until sign out. .currentUserType returns the currently logged in user.

Example:

this._tokenService.init({userTypes: [{name: 'ADMIN',path: 'admin'},{name: 'USER',path: 'user'}]});this._tokenService.signIn({email: 'example@example.com',password: 'secretPassword',userType: 'ADMIN'})this._tokenService.currentUserType;// ADMIN

Route Guards

Angular2-Token implements the CanActivate interface, so it can directly be used as a route guard. If the signInRedirect option is set the user will be redirected on a failed (=false) CanActivate using Router.navigate(). It currently does not distinguish between user types.

Example:

constrouterConfig: Routes=[{path: '',component: PublicComponent},{path: 'restricted',component: RestrictedComponent,canActivate: [Angular2TokenService]}];

Advanced Usage

More advanced methods can be used if a higher degree of customization is required.

.request()

More customized requests can be send with the .request()-function. It accepts the RequestOptionsArgs-Interface. More information can be found in the Angular2 API Reference here.

request(options: RequestOptionsArgs): Observable<Response>

Example:

this._tokenService.request({method: RequestMethod.Post,url: 'my-resource/1',data: mydata});

.userSignedIn()

Returns true if a user is signed in. It does not distinguish between user types.

userSignedIn(): boolean

.currentUserType

Returns current user type as string like specified in the options.

get currentUserType(): string

.currentUserData

Returns current user data as returned by devise token auth. This variable is null after page reload until the .validateToken() call is answerd by the backend.

get currentUserData(): UserData

.currentAuthData

Returns current authentication data which are used to set auth headers.

get currentAuthData(): AuthData

.currentAuthHeaders

Returns current authentication data as an HTTP ready Header object.

get currentAuthHeaders(): Header

Redirect original requested URL

If you want to redirect to the protected URL after signing in, you need to set signInStoredUrlStorageKey and in your code you can do something like this

this._tokenService.signIn({email: 'example@example.org',password: 'secretPassword'}).subscribe(res=>{// You have to add Router DI in your componentthis.router.navigateByUrl(localStorage.getItem('redirectTo'));},error=>console.log(error));

Common Problems

CORS Configuration

If you are using CORS in your Rails API make sure that Access-Control-Expose-Headers includes access-token, expiry, token-type, uid, and client. For the rack-cors gem this can be done by adding the following to its config. More information can be found here. ruby :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client']

Missing Routes

Make sure that your projects includes some kind of routing.

Development

If the package is installed from Github specified in the package.json, you need to build the package locally.

cd ./node_modules/angular2-token
npm install
npm run build

Testing

npm test

Credits

Test config files based on Angular2 Webpack Starter by AngularClass

License

The MIT License (see the LICENSE file for the full text)

About

🔑 Token based authentication service for Angular2 (ng2) with multi-user support. Works best with the devise token auth gem for Rails. Demo:

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages