小编Dav*_*lar的帖子

OpenID,OpenID2,Open Connect的未来是什么?是否值得实施提供商?

我看到OpenID登录在任何地方都可用,并决定我应该考虑在我的服务器上实现我自己的提供程序,以便我可以控制我的信息和登录.

令人惊讶的是,这非常复杂和困难.

即使许多站点允许OpenID登录(例如这个),我发现了以下问题:

  1. 许多简单的"自己动手"的单一身份OpenID提供商解决方案现在都是蒸发器.
  2. OpenID存在相当严重的持续安全问题:

http://en.wikipedia.org/wiki/OpenID#Security

  1. 许多OpenID提供商似乎已经消失(MyOpenID.com,getopenid.com等).
  2. 该协议似乎不断变化,以前的版本被删除(可能是由于安全问题?)

例如,从2013年8月开始,关于使用Google Plus/Profiles作为代表的SO的解决方案现在得到了Google的错误,称今年4月将从Google移除OpenID 2.0支持并替换为OpenID Connect:

将OpenID委托给Google(不是Google Apps)

有人甚至提供简单的OpenID Connect 单一身份提供商吗?查看OpenID的OpenID提供程序软件列表根本没有提到任何OpenID Connect解决方案,更不用说该页面在4年内没有更新!

http://wiki.openid.net/w/page/12995226/Run%20your%20own%20identity%20server

仔细查看所有这些信息,我很高兴我几年前搁置了我的计划,在我的服务器上实现OpenID 2.0,因为它看起来已经过时了,我想不出一个简单的方法来证明我的身份.令人惊讶的是,我不能只安装一个软件包并编辑配置文件.大多数更简单的实现涉及安装和使用PHP,它有自己需要了解的安全问题.

那么 - 任何一个OpenID专家和它的目标谁能给我一些关于如何设置我的身份提供者或者是否值得困难的建议?我希望控制我的信息和分发我的电子邮件地址以及拥有永久性身份,但如果标准不断变化那么它就不是永久性的.

openid google-openid openid-provider openid-connect

16
推荐指数
2
解决办法
1457
查看次数

Vim:如何从vim内部删除/清除mkview创建的视图

mkview和loadview是在vim中保存状态的绝佳方法,很多人使用这样的.vimrc命令来自动保存所有文件的状态.

au BufWinLeave ?* mkview
au BufWinEnter ?* silent loadview
Run Code Online (Sandbox Code Playgroud)

这将创建状态文件(在〜/ .vim/view等位置)

但有时,您希望清除视图信息,以便文件以新的状态启动.

我能看到这样做的唯一方法是:

  1. 从命令行中查找并删除相应的.vim/view /文件
  2. 暂时编辑.vimrc以关闭加载视图,打开文件并恢复.vimrc

这些都很麻烦,涉及到vim以外的事情.是不是有某种方法:

  1. 打开一个文件而不进行loadview(或者可能是一种将选项传递给vimrc以跳过loadview的方法?)所以当我们关闭时我们会有一个明确的mkview
  2. 删除/清除loadview设置的任何状态,或者从vim内部删除给定文件的相应loadview文件

我想你可以编写一个带有文件路径的shell脚本,并试图找出.vim/view目录中vim的'= +'路径编码并删除它然后从vim内部调用shell脚本,但看起来好像vim应该对此有一些支持.

vim

12
推荐指数
1
解决办法
2434
查看次数

Rails设计:"您需要在继续之前登录或注册"而不是"您将收到一封包含说明的电子邮件......"

我已经设置了Devise on Rails 4.2.0并且一切似乎都在工作,我使用了以下指南:

http://sourcey.com/rails-4-omniauth-using-devise-with-twitter-facebook-and-linkedin/

我的设计模块是:

devise :database_authenticatable, :registerable, :confirmable,
       :recoverable, :rememberable, :trackable, :validatable, :omniauthable
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,如果我尝试通过转到注册页面创建一个新帐户,然后在输入我的电子邮件和新密码(两次)后,我将被带回登录页面并看到"未经验证"的消息:

 You need to sign in or sign up before continuing
Run Code Online (Sandbox Code Playgroud)

相反,我应该得到'send_instructions'消息:

 You will receive an email with instructions for how to confirm your email address in a few minutes.
Run Code Online (Sandbox Code Playgroud)

我的ApplicationController中有一个before_filter:

before_filter :authenticate_user!, :except => [:show]
Run Code Online (Sandbox Code Playgroud)

虽然我承认我不明白为什么这不会在登录页面或"忘记密码"页面上给我验证错误.无论哪种方式,我尝试添加:new_user_session到:除了,但这没有帮助.

当有人注册时,如何获得正确的闪存通知?

我没有覆盖任何设计代码(除了sourcey doc建议的内容),我的DeviseHelper只有一个打印出flash消息的方法:

def devise_error_messages!
    return '' if resource.errors.empty?

    messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
    messages.html_safe
end
Run Code Online (Sandbox Code Playgroud)

编辑:

我最初搜索SO没有帮助(太多类似的问题没有相关性),但现在我发现了这个:

在sign_out错误后设计sign_in

所以我认为问题是,在我执行sign_up操作后,Devise正试图将我带到root_path.我不知道为什么会这样做:确认设置,它似乎应该带我回到sign_in页面.

我尝试通过使用以下命令覆盖cutom注册控制器中的'after_sign_up_path_for'来覆盖它:

覆盖设计注册控制器

也许我做错了,但这似乎没有帮助.

所以现在的问题是,在有人做sign_up后,如何让Devise回到sign_in页面,为什么这不是可确认设置的默认操作?

ruby ruby-on-rails confirmation-email email-confirmation devise

6
推荐指数
1
解决办法
8157
查看次数

用户正在使用 Rails / Devise 从其他登录用户那里获取会话

我正在使用 Devise 和 Ruby on Rails 来开发游戏。

用户可以登录并加入游戏。

当他们第一次登录时,一切都很好 - 这表明他们以预期的人身份登录。

但是我很少注意到(在现实世界中使用以及在测试中一次)让我感到困惑的情况。

突然,其中一个用户“变成”了不同的用户。就好像他们以其他用户身份登录一样。他们可以完全访问他们的帐户,Rails 认为他们以不同的用户身份登录。诸如“current_user.name”和“current_user.email”之类的所有内容都取决于其他用户,即他们之前未登录的用户以及他们无权成为的用户。

我无法弄清楚这可能来自我的代码中的哪里。我不想在这里发布我的全部代码,所以我希望能对如何在我的代码中导致这样的事情发生进行一些头脑风暴- 或者我更有可能在寻找一个设计错误设计是否搞砸了它在某些竞争条件下返回的会话?

对于使用 devise 的任何站点,从一般安全角度来看,后者处理起来有些可怕,但我认为其他人现在应该已经看到了。所以我认为它必须在我的代码中 - 但在我的代码中没有任何地方我触摸会话信息,也没有做任何奇怪的事情,比如将 current_user 分配给任何东西。

要非常清楚会发生什么:

  1. “Bob”以“Bob”的身份登录他的设备并看到他是“Bob”(current_user.name)并且可以访问“Bob”的东西。
  2. “Joe”以“Joe”的身份登录他的设备并看到他是“Joe”(current_user.name)并且可以访问“Joe”的东西。
  3. 在跟随任意数量的内部链接之一(不更改/设置用户信息)之后,“Joe”正在使用的设备现在显示为“Bob”(current_user.name)并且可以访问“Bob”的东西(例如编辑他的个人资料页面等。 - 全部由 current_user 保护)。

关于我可能缺少什么的任何想法?

我的设计设置允许使用电子邮件/密码登录以及使用 Facebook 等进行 oauth 登录。

——

根据要求,这是设计迁移:

——

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table(:users) do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails devise

5
推荐指数
1
解决办法
489
查看次数

Ruby WeakRef 有隐式竞争条件?

我正在查看 Ruby WeakRef,似乎 API 的编写方式存在隐含的竞争条件,尽管它似乎不太可能命中。

API隐含的基本用法是:

obj = Object.new
foo = WeakRef.new(obj)

# Later on:
if (foo.weakref_alive?)
    puts "I can allegedly use #{foo.to_s} now"
end

# Or even:
obj2 = foo.__getobj__ if foo.weakref_alive?
Run Code Online (Sandbox Code Playgroud)

问题在于我们无法控制垃圾收集何时发生,例如,考虑另一个定期调用GC.start.

weakref_alive?如果我们在检查和使用对象之间发生垃圾收集,那么我们最终将遇到RefError异常。

(我实际上希望任何使用weakref的大型应用程序 - 特别是那些多线程的应用程序 - 偶尔会因此而遇到RefErrors)

令我惊讶的是,如果我们检查对象时该对象可用,则无法以原子方式安全地获取该对象。

所以问题首先是,我是否过度担心了?如果我们在检查对象后立即获取对象(如第二个示例中所示),是否有某种原因我们不必担心 GC 的发生?如果不是,那么这就给我们带来了第二个问题,即安全使用弱引用的最佳方法。

现在我已经在类中添加了一个“obj”方法作为处理它的一种方法:

require 'weakref'
class WeakRef
  def obj
    begin
      return self.__getobj__
    rescue RefError
      return nil
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但不必要的“救援”言论有点让我烦恼。我想我们还可以:

require 'weakref'
class WeakRef
  def obj
    savegc = GC.disable
    obj = …
Run Code Online (Sandbox Code Playgroud)

ruby garbage-collection race-condition

5
推荐指数
1
解决办法
282
查看次数

ruby 2.7.0 文档声称有 String '/' 方法,但它似乎不存在

从:

https://ruby-doc.org/core-2.7.0/String.html#method-i-2F

看起来我们可以执行以下任一操作来进行拆分:

got = str.split(',')
got = str/','
Run Code Online (Sandbox Code Playgroud)

但第二个似乎不起作用(“./”或“./(ch)”等也不起作用),而是给出了一种未找到的方法(MRI 2.7.0)

事实上,当我这样做时,我什么也没得到:

 puts String.methods.index(:/)
Run Code Online (Sandbox Code Playgroud)

(虽然现在我已经在 Integer 上尝试过了,但我发现它也没有出现在那里)

这是文档中的错误吗?

ruby

5
推荐指数
1
解决办法
59
查看次数

ruby 无法从 Thread.abort_on_exception 中拯救或看到中止

我需要立即捕获线程中的异常并停止所有线程,因此我在脚本中使用 abort_on_exception。不幸的是,这意味着异常不会引发到父线程 - 也许这是因为异常最终发生在全局范围内?

无论如何,这是一个显示问题的示例:

Thread.abort_on_exception = true

begin
  t = Thread.new {
    puts "Start thread"
    raise saveMe
    puts "Never here.."
  } 
  t.join
rescue => e
  puts "RESCUE: #{e}"
ensure
  puts "ENSURE"
end
Run Code Online (Sandbox Code Playgroud)

使用 abort_on_exception 时如何挽救线程中引发的异常?

这是一个新的例子,展示了更令人难以置信的事情。该线程能够终止 begin 块内的执行,但它不会引发任何异常?

Thread.abort_on_exception = true
begin
  t = Thread.new { raise saveMe }                     
  sleep 1
  puts "This doesn't execute"
rescue => e 
  puts "This also doesn't execute"
ensure
  puts "But this does??"
end   
Run Code Online (Sandbox Code Playgroud)

ruby multithreading raise rescue

4
推荐指数
1
解决办法
3085
查看次数

为什么模块内的 ruby​​ 类不能与常规类具有相同的作用域?

我有一个内部有类的模块,但我发现如果不指定模块路径,内部类无法访问封闭模块中的任何方法。

另一种看待它的方法是 module_function 似乎没有带入类中。

例子:

module MyMod
  def meaning
    42
  end

  class Foo
    def initialize
      puts "New Foo"
      puts "I can call #{MyMod.meaning} from here"
      puts "But I can't get to #{meaning} from here"
    end
  end

  def go
    puts "I can get to #{meaning} from here"
    bar = Foo.new
  end

  module_function :go, :meaning
  go
end
Run Code Online (Sandbox Code Playgroud)

如果运行此命令,您会在“但是我不能...”行中收到错误:

undefined local variable or method `meaning'
Run Code Online (Sandbox Code Playgroud)

但是,如果删除整个文件周围的 MyMod 位,则访问外部方法就没有问题。

有没有一种简单的方法可以让这些访问而无需提供完整路径?

(我对不包含完整路径吹毛求疵的原因之一是因为我使用http://redshift.sourceforge.net/script/来创建我可以实例化的 ruby​​ 脚本 - 而且它们没有清晰而简单的名称,例如“MyMod”,我可以将其添加到路径中,实际上我必须传递范围,即使它只是类的封闭范围)

ruby scope

2
推荐指数
1
解决办法
864
查看次数

utf-8的perl binmode仅用于\ x {codepoint},而不是用于三字节编码的\ x编码

欧洲字符是UTF-8 0xe282ac

我正在尝试在perl中使用字符串,并将UTF-8字符输出到STDOUT.

所以我用'use utf8'将脚本设置为UTF-8

我将STDOUT设置为带有'binmode'的 UTF-8 .

示例脚本是:

use utf8;
binmode STDOUT, ':utf8';
print "I owe you 160\x{20ac}\n";
print "I owe you 80\xe2\x82\xac\n";  # UTF-8 encoding?
Run Code Online (Sandbox Code Playgroud)

\ x {codepoint}工作正常,但编码UTF-8会给我一个错误:

I owe you 160€
I owe you 80â¬
Run Code Online (Sandbox Code Playgroud)

unicode perl encoding utf-8

0
推荐指数
1
解决办法
941
查看次数