Rails 下添加阿里(alipay)快捷登录简易案例

示例项目地址 https://github.com/kai209209/alipay-login-example

  • 申请获得阿里alipay的pid和key,并申请快捷登录功能
  • 在运行之前先把你的hosts文件修改一下,设置本地使用的域名指向本机(ubuntu 14.04)
sudo vim /etc/hosts
0.0.0.0         alipay-login-test.com

~
~
~
~
~
~
~
~
"/etc/hosts" 15L, 408C                                        1,1          全部

然后重启你的网卡使域名生效.

/etc/init.d/networking restart

  • 登录管理设置和路由设置

本例登录管理使用的是devise.

路由设置如下:

rotues.rb

Rails.application.routes.draw do
  resource :user, only: :show
  devise_for :users, controllers: { sessions: "users/sessions" }
  devise_scope :user do
    get ‘alipay_login‘, to: redirect(User.redirect_to_alipay_login_gateway)   #重定向路由
    get ‘sign_from_alipay‘, to: ‘users/sessions#sign_from_alipay‘             #支付宝登录后返回的接口
  end
  root ‘static#index‘
end
  • 登录

在所需要的页面添加登录按钮

= link_to "登录", alipay_login_path, class: "btn btn-primary"

当用户点击登录按钮以后,路由将会重定向到User model的self.redirect_to_alipay_login_gateway方法.

在之前本来是想直接定义一个helper,然后直接通过helper产生一个链接直接链接到alipay的快捷登录页面的,但是由于直接使用helper有可能会暴露申请的pid和key,所以使用路由重定向的方式进行快捷登录.

self.redirect_to_alipay_login_gateway方法是根据快捷登录文档的解读,对需要的信息进行对于拼接,最后生成返回一个地址进行跳转登录

  def self.redirect_to_alipay_login_gateway
    options = { "service" => "alipay.auth.authorize",
                "partner" => "xxxxxxxxxxx", #申请的alipay id
                "_input_charset" => "utf-8",
                "return_url" =>  "xxxxxxxxxxxx", #回调的接口,处理登录, 例如开发环境alipay-login-test:3000/sign_from_alipay
                "target_service" => "user.auth.quick.login" }
    options.merge!("sign_type" => "MD5",
                   "sign" => Digest::MD5.hexdigest(options.sort.map{|k, v| "#{k}=#{v}"}.join("&") + "xxxxxxxxxxxxx(#申请的alipay key)"))
    "https://mapi.alipay.com/gateway.do?#{options.sort.map{|k,v|"#{CGI::escape(k.to_s)}=#{CGI::escape(v.to_s)}"}.join("&")}"
  end

跳转至支付宝,且登录成功后,支付宝会根据return_url的地址将所需的信息拼接打包返回到该接口,返回的大致如下

Started GET "/sign_from_alipay?is_success=T&notify_id=xxxxxxxxxxxxxxxxxxxxxx&real_name=xxxxxxxxxxxxx&token=xxxxxxxxxxxxxxxxxxxxxxxxxxxx&user_id=xxxxxxxxxxxxxxxxxxxxxxxxxx&sign=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&sign_type=MD5" for 127.0.0.1 at 2015-09-08 15:48:23 +0800
Processing by Users::SessionsController#sign_from_alipay as HTML
  Parameters: {"is_success"=>"T", "notify_id"=>"xxxxxxxxxxxxxxxxxxxxxxxxxxx", "real_name"=>"xxxxxxxxxxxxxxxxxxx", "token"=>"xxxxxxxxxxxxxxxxxxxxxxx", "user_id"=>"xxxxxxxxxxxxxxxxxxxxx1", "sign"=>"xxxxxxxxxxxxxxxxxxxxxxxxxx", "sign_type"=>"MD5"}

返回访问 sign_from_alipay接口

  def sign_from_alipay
    notify_params = params.except(*request.path_parameters.keys)
    if User.alipay_valid_check(notify_params[:notify_id])    #根据文档,对返回信息进行校验以确保该信息是从alipay返回的
      @user = User.from_alipay(params)                       #登录前对数据库进行查找
      sign_in(:user, @user)                                  #devise的方法sign_in(resource_name, resource),使用该方法登录@user
      redirect_to user_path
    else
      render text: ‘error‘                                   #如果校验错误进行下一步操作
    end
  end

信息返回校验方法

  def self.alipay_valid_check(notify_id)
    uri = URI("https://mapi.alipay.com/gateway.do")
    uri.query = URI.encode_www_form(
      ‘service‘ => ‘notify_id‘,
      ‘partner‘ => "xxxxxxxxxxx", #申请的alipay id
      ‘notify_id‘ => notify_id
    )
    Net::HTTP.get(uri) == "true"
  end

登录前对数据库进行查找

数据库进行查找是否有该用户,如果有则从数据库取出,如果没有则创建该用户

def self.from_alipay(params)
    where(uid: params[:user_id]).first_or_create do |user|
      user.uid = params[:user_id]
      user.name = params[:real_name]
    endend
  • 总结

这一整个过程看似简单,就几个方法就能完成这整个登录的过程,但是这阿里快捷登录rails用的比较少,网上关于rails下阿里快捷登录的资料比较少,所以还是花了几天时间来摸索完成该功能的,其中很多代码参照https://github.com/chloerei/alipay的源码来写的.非常感谢写该alipay库的前辈.

时间: 2024-08-02 19:04:43

Rails 下添加阿里(alipay)快捷登录简易案例的相关文章

Ubuntu 下添加OpenERP command 快捷启动方式

编辑home目录下的.bashrc文件 alias xjerp="~/odoo/xj/openerp-server -r openerp --addons-path='~/odoo/xj/openerp/addons'" 重启shell即可. Ubuntu 下添加OpenERP command 快捷启动方式

linux下添加新用户,切换用户登录

如何在linux下添加用户?以及成功退出用户登录?以及切换用户登录? 步骤如下: 命令行输入 adduser 用户名(如:lanp) 回车,(注意:此处linux不会显示任何信息出来); 接着输入 passwd 用户名 回车: 提示你输入新的密码,以及密码输入后的确认密码:(注意,在你输入密码时,linux是不会显示的) 出现身份验证令牌已经成功更新,表示用户以及创建成功: 退出用户登录,直接 logout 回车即可; root切换到普通用户,用命令su 用户名(su即switch user切换

如何用支付宝扫描二维码登录网站 - 支付宝快捷登录

前面介绍过<用c#开发微信 (20) 微信登录网站 - 扫描二维码登录>,本文介绍如何用支付宝扫描二维码登录网站.      1 注册企业支付宝帐号 https://enterpriseportal.alipay.com/login.htm 2 实名认证 提供公司相关证件进行实名认证,提交后,通过了会收到通知邮件. 3选择产品.签约 选择产品商店 –> 快捷登录   作者:疯吻IT 出处:http://fengwenit.cnblogs.com   4 技术集成 4.1下载技术集成文档

嵌入式环境:CentOS下添加用户并且让用户获得root权限

CentOS下添加用户并且让用户获得root权限 http://www.centoscn.com/CentOS/config/2014/0810/3471.html 1.添加用户,首先用adduser命令添加一个普通用户,命令如下:  #adduser tommy //添加一个名为tommy的用户#passwd tommy   //修改密码Changing password for user tommy.New UNIX password:     //在这里输入新密码Retype new UN

NodeJS下的阿里云企业邮箱邮件发送问题

还没有到11点,再顺带发一个上次碰到NodeJS的邮箱插件nodeMailer不支持阿里云邮件问题. 网上很多资料都默认使用QQ之类的邮箱,因为nodeMailer默认添加了QQ之类的SMTP地址,但是阿里云的地址我没 找到,需要自己手动添加, nodeMailer下的 node_modules…找到 nodemailer-wellknown services.json,打开,在最后添加阿里云企业邮箱的SMTP即可 nodeMailer的github地址:https://github.com/a

ubuntu下添加自动执行程序的方法

1. 开机启动时自动运行程序 Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init.init根据配置文件继续引导过程,启动其它进程.通常情况下,修改放置在 /etc/rc或 /etc/rc.d 或 /etc/rc?.d 目录下的脚本文件,可以使init自动启动其它程序.例如:编辑/etc/rc.d/rc.local 文件(该文件通常是系统最后启动的脚本),在文件最末加上一行"xinit"或"startx",可以在开机启动后直接进入X-Windo

点击UITextFiled键盘不出现(支付宝快捷登录)

最近在做支付宝快捷支付和快捷登录,如果手机端装有"支付宝钱包"这个很正常,但是在手机端没有装支付宝钱包时按照支付宝提供文档应该会出现H5页面(网页版)进行操作,但是会遇到调用API: //scheme与info.plist注册的URL Scheme保持一致 [[AlipaySDK defaultService] auth_V2WithInfo:signString fromScheme:@"Bao" callback:^(NSDictionary *resultDi

Linux下添加,删除,修改,查看用户和用户组

linux下添加,删除,修改,查看用户和用户组 1,创建组 groupadd test 增加一个test组 2,修改组 groupmod -n test2 test 将test组的名子改成test2 3,删除组 groupdel test2 删除 组test2 4,查看组 a),查看当前登录用户所在的组 groups,查看apacheuser所在组groups apac 一,组操作 1,创建组 groupadd test 增加一个test组 2,修改组 groupmod -n test2  te

Windows XP系统下添加任务计划常出现问题解决办法

Windows XP系统下添加任务计划常出现问题解决办法 计划任务就是让电脑在指定的时间内执行指定的动作(计划动作),这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的(通俗一些就是双击可以运行的). 添加步骤:“开始”-->“设置”-->“控制面板”-->“任务计划”(或者“开始”-->“程序”-->“附件”-->“系统工具”-->“任务计划”),打开到“任务计划”窗口后,双击“添加任务计划”,然后一步一步按步骤运行.     问题一:在试着设置任