Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Standardized multi-provider OAuth authentication

License

NotificationsYou must be signed in to change notification settings

msa7/multi_auth

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

75 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status

MultiAuth is a library that standardizes multi-provider authentication for web applications. Currently supported providers:

Installation

Add this to your application'sshard.yml:

dependencies:multi_auth:github:msa7/multi_auth

Usage

MultiAuth public interface

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

Development

Install docker

Setup everythings

make setup

Run specs

make tmake t c=spec/providers/twitter_spec.cr

Run code linter

make l

Contributors


[8]ページ先頭

©2009-2025 Movatter.jp