- Notifications
You must be signed in to change notification settings - Fork23
Standardized multi-provider OAuth authentication
License
NotificationsYou must be signed in to change notification settings
msa7/multi_auth
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
MultiAuth is a library that standardizes multi-provider authentication for web applications. Currently supported providers:
- Github.com
- Gitlab.com (orown instance)
- Facebook.com
- Vk.com
- Google.com,setup google
- Twitter.com
- Restream.io
Add this to your application'sshard.yml
:
dependencies:multi_auth:github:msa7/multi_auth
require"multi_auth"MultiAuth.config("github",ENV['ID'],ENV['SECRET'])# configuration multi_auth=MultiAuth.make(provider, redirect_uri)# initialize engine multi_auth.authorize_uri# URL to provider authentication dialog# on http callback, like /multi_auth/github/callback user= multi_auth.user(params)# get signed in user
MultiAuth build with no dependency, it can be used with any web framework. Information about signed in user described in User class heresrc/multi_auth/user.cr. Supported providerssrc/multi_auth/providers. I hope it easy to add new providers.
Kemal integration example
<ahref="/multi_auth/github">Sign in with Github</a>
MultiAuth.config("facebook","facebookClientID","facebookSecretKey")MultiAuth.config("google","googleClientID","googleSecretKey")defself.multi_auth(env) provider= env.params.url["provider"] redirect_uri="#{Kemal.config.scheme}://#{env.request.host_with_port.as(String)}/multi_auth/#{provider}/callback"MultiAuth.make(provider, redirect_uri)endget"/multi_auth/:provider"do |env| env.redirect(multi_auth(env).authorize_uri)endget"/multi_auth/:provider/callback"do |env| user= multi_auth(env).user(env.params.query)p user.email userend
Lucky integration example
# config/watch.ymlhost: myapp.lvh.meport:5000# config/multi_auth_handler.crrequire"multi_auth"classMultiAuthHandlerMultiAuth.config("facebook","facebookClientID","facebookSecretKey")MultiAuth.config("google","googleClientID","googleSecretKey")defself.authorize_uri(provider :String)MultiAuth.make(provider,"#{Lucky::RouteHelper.settings.base_uri}/oauth/#{provider}/callback").authorize_uri(scope:"email")enddefself.user(provider :String, params :Enumerable({String,String}))MultiAuth.make(provider,"#{Lucky::RouteHelper.settings.base_uri}/oauth/#{provider}/callback").user(params)endend# src/actions/oauth/handler.crclassOAuth::Handler <BrowserAction get"/oauth/:provider"do redirectto:MultiAuthHandler.authorize_uri(provider)endend# src/actions/oauth/handler/callback.crclassOAuth::Handler::Callback <BrowserAction get"/oauth/:provider/callback"do user=MultiAuthHandler.user(provider, request.query_params) text user.email.to_sendend
Amber integration example
# config/initializers/multi_auth.crrequire"multi_auth"MultiAuth.config("facebook","facebookClientID","facebookSecretKey")MultiAuth.config("google","googleClientID","googleSecretKey")# config/routes.crroutes:webdo ... get"/multi_auth/:provider",MultiAuthController,:new get"/multi_auth/:provider/callback",MultiAuthController,:callbackend# src/controllers/multi_auth_controller.crclassMultiAuthController <ApplicationControllerdefnew redirect_to multi_auth.authorize_uri(scope:"email")enddefcallback multi_auth_user= multi_auth.user(request.query_params)if user=User.find_byemail: multi_auth_user.email login userelse user=User.create!(first_name: multi_auth_user.first_name,last_name: multi_auth_user.last_name,email: multi_auth_user.email ) login userend redirect_to"/"enddeflogin(user) context.session["user_id"]= user.idenddefprovider params[:provider]enddefredirect_uri"#{Amber.settings.secrets["base_url"]}/multi_auth/#{provider}/callback"enddefmulti_authMultiAuth.make(provider, redirect_uri)endend
Marten integration example
# config/initializers/multi_auth.cr# ----require"multi_auth"MultiAuth.config("github","<github_client_id>","<github_secret_key>")# config/routes.cr# ----Marten.routes.drawdo path"/oauth/<provider:string>",OAuthInitiateHandler,name:"oauth_initiate" path"/oauth/<provider:string>/callback",OAuthCallbackHandler,name:"oauth_callback"end# src/handlers/concerns/with_oauth.cr# ----moduleWithOAuthdefmulti_authMultiAuth.make(provider, redirect_uri)endprivatedefprovider params["provider"].to_sendprivatedefredirect_uri"#{request.scheme}://#{request.host}#{reverse("oauth_callback",provider: provider)}"endend# src/handlers/oauth_initiate_handler.cr# ----require"./concerns/**"classOAuthInitiateHandler <Marten::HandlerincludeWithOAuthdefget redirect multi_auth.authorize_uri(scope:"email")endend# src/handlers/oauth_initiate_callback.cr# ----require"./concerns/**"classOAuthCallbackHandler <Marten::HandlerincludeWithOAuthdefget user_params=Hash(String,String).new.tapdo |params| request.query_params.each { |k,v| params[k]= v.last }end multi_auth_user= multi_auth.user(user_params)unless user=Auth::User.get(email: multi_auth_user.email) user=Auth::User.create!(email: multi_auth_user.email)do |new_user| new_user.set_unusable_passwordendendMartenAuth.sign_in(request, user) redirect"/"endend
Install docker
Setup everythings
make setup
Run specs
make tmake t c=spec/providers/twitter_spec.cr
Run code linter
make l
- Sergey Makridenkov - creator, maintainer
- Vitalii Elenhaupt - contributor
About
Standardized multi-provider OAuth authentication
Topics
Resources
License
Stars
Watchers
Forks
Packages0
No packages published