小编DID*_*x13的帖子

如何在服务器端消费Facebook用户访问令牌?

前言

我正在开发几个Web服务和一些客户端(Web应用程序,移动设备等),它们将通过HTTP与所述服务进行交互.我目前的工作项目是为产品设计身份验证和授权解决方案.我已决定利用外部身份提供商(如Facebook,Google,Microsoft,Twitter等)进行身份验证.

我正试图解决这个问题,"当我的服务器发出请求时,我怎么知道用户是谁以及我怎么能确定?".下面还有更多问题......

要求

  1. 依靠外部身份来表明我正在与谁打交道('userId'基本上就是我所关心的).
  2. 系统应使用基于令牌的身份验证(而不是cookie或基本身份验证).

    我相信这是扩展多个客户端和服务器同时提供松散耦合的正确选择.

工作流程

根据我对基于令牌的身份验证的阅读和理解,以下是我想象的工作流程.现在让我们在Facebook浏览器上关注Facebook.我的假设是其他外部身份提供者应该具有类似的能力,尽管我还没有确认.

请注意,截至撰写时,我的基础是Facebook登录版2.2

  1. 客户:使用JavaScript SDK启动登录Facebook
  2. Facebook:用户验证和批准应用权限(例如访问用户的公开个人资料)
  3. Facebook:向客户发送响应,其中包含用户的访问令牌,ID和签名请求
  4. 客户端:在浏览器会话中存储用户访问令牌(方便地由SDK处理)
  5. 客户端:通过在授权标头中发送用户的访问令牌+用户的ID(可能在自定义标头中),向我的Web服务请求安全资源
  6. 服务器:从请求标头读取用户访问令牌,并通过向Facebook提供的debug_token图形API发送请求来启动验证
  7. Facebook:使用用户访问令牌信息(包含appId和userId)回复服务器
  8. 服务器:通过将appId与预期(自身已知)和userId与客户端请求上发送的内容进行比较,完成对令牌的验证
  9. 服务器:使用请求的资源响应客户端(假设快乐的授权路径)

我想象对于后续的服务器请求会重复步骤5-9(当用户的访问令牌有效时 - 未过期,从FB端撤销,应用权限更改等)

这是一个帮助您完成这些步骤的图表.请理解这个系统不是单页面应用程序(SPA).提到的Web服务是基本上为客户端提供JSON数据的API端点; 它们不提供HTML/JS/CSS(Web客户端服务器除外).

工作流程图

问题

  1. 首先,根据我的前言和要求,所描述的方法是否有任何明显的差距/陷阱?

  2. 是否正在向Facebook执行出站请求,以根据所需/推荐的客户端请求验证访问令牌(上面的步骤6-8)?

    我至少知道,我必须验证来自客户端请求的访问令牌.但是,我不知道在第一次验证后进行后续验证的推荐方法.如果有典型的模式,我很想听听它们.据我所知,根据我的要求,他们可能依赖于应用程序; 但是,我只是不知道该寻找什么.一旦我有了基本想法,我就会进行尽职调查.

    例如,可能的想法:

    • 在第一次验证完成后散列访问令牌+ userId对,并将其存储在分布式缓存中(可由所有Web服务器访问),其到期时间等于访问令牌.根据客户端的后续请求,对访问令牌+ userId对进行散列并检查其是否存在于缓存中.如果存在,则请求被授权.否则,请访问Facebook图形API以确认访问令牌.我假设如果我使用HTTPS(我会这样),这个策略可能是可行的.但是,性能如何比较?

    • 此StackOverflow问题中接受的答案建议在Facebook用户令牌的第一次验证完成后创建自定义访问令牌.然后,自定义令牌将被发送到客户端以用于后续请求.不过,我想知道这是否比上述解决方案更复杂.这需要实现我自己的身份提供者(我想避免的事情,因为我想首先使用外部身份提供者......).这个建议有什么好处吗?

  3. 是signedRequest字段存在于在上述(步骤提到#3的响应此处),相当于签名的请求参数这里在"游戏画布登录"流?

    它们似乎被暗示为等同,因为前者在文档中与后者相关联.但是,我很惊讶在Web文档的"手动构建登录流程" 页面中没有提到游戏页面上提到的验证策略.

  4. 如果#3的答案为"是",那么解码签名的相同身份确认策略是否可以与服务器端预期使用的策略进行比较?

    从FB文档解码和比较

    我不知道是否这可以利用,而不是把所述debug_token图形API的出站呼叫(步骤#6的上方),以确认访问令牌的建议这里:

    来自FB docs的debug_token图形API

    当然,为了在服务器端进行比较,需要将签名的请求部分与请求一起发送到服务器(上面的步骤#5).除了在不牺牲安全性的情况下的可行性之外,我想知道性能与进行出站呼叫相比如何.

  5. 虽然我正处于这种状态,但在什么情况/出于何种目的,您是否会将用户的访问令牌持久存储到数据库中?我没有看到我需要这样做的场景,但是,我可能会忽视某些事情.我很好奇是一些常见的场景可能会引发一些想法.

谢谢!

security authentication facebook facebook-authentication facebook-access-token

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

Bootstrap - 填充剩余的垂直空间

我正在尝试使用bootstrap设计此布局.我把徽标和导航栏,但现在我必须插入剩余的div.
我需要将这个div(带问号)扩展到页面的剩余空间(带图片的边距).
我不知道徽标或导航栏百分比高度.

在此输入图像描述


编辑:发布我的代码(Yii框架的源页面)

 <a href="index.html"><img width="150" src="images/logo.png"/></a>
 <nav class="navbar navbar-default">
 <div class="container-fluid">
    <div class="navbar-header">
        <button class="navbar-toggle btn btn-default" data-toggle="collapse" data-target="#yii_booster_collapse_yw0" id="yw1" name="yt0" type="button">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
        </button></div>
        <div class="collapse navbar-collapse" id="yii_booster_collapse_yw0">
            <ul id="yw2" class="nav navbar-nav">
                <li class="active">
                    <a href="index.php/site/home">Home</a>
                </li>
            </ul>
            <ul class="pull-right nav navbar-nav" id="yw3">
                <li>
                    <a href="index.php/user/profile/edit">Profile</a>
                </li>
                <li class="dropdown">
                    <a class="dropdown-toggle" data-toggle="dropdown" href="index.php/site/home">Options <span class="caret"></span>
                    </a>
                    <ul id="yw4" class="dropdown-menu">
                        <li>
                            <a tabindex="-1" href="index.php/site/contact">Contact Us</a>
                        </li>
                        <li>
                            <a tabindex="-1" href="index.php/user/profile/changepassword">Change password</a>
                        </li>
                    </ul> …
Run Code Online (Sandbox Code Playgroud)

html css twitter-bootstrap

33
推荐指数
1
解决办法
1万
查看次数

重试丢失或失败的任务(Celery,Django和RabbitMQ)

有没有办法确定是否有任何任务丢失并重试?


我认为丢失的原因可能是调度程序错误或工作线程崩溃.

我打算重试它们,但我不确定如何确定哪些任务需要退役?

以及如何自动完成此过程?我可以使用自己的自定义调度程序来创建新任务吗?

编辑:我从文档中发现RabbitMQ从未松散任务,但是当工作线程在任务执行过程中崩溃时会发生什么?

rabbitmq celery django-celery

16
推荐指数
1
解决办法
7420
查看次数

psql:致命:无法从GTM获取事务ID.GTM可能已失败或丢失连接

我想创建一个postgres-xl集群.该集群包括5个节点,1个GTM,2个协调器和2个Datanode.以下是节点的详细信息

GTM:   
hostname=localhost  
nodename=gtm  
IP=127.0.0.1  
port=20001

Coordinator1?  
hostname=localhost  
nodename=coord1  
IP=127.0.0.1  
pooler_port=30011?port=30001  

Coordinator2?  
hostname=host2  
nodename=coord2  
IP=10.4.6.36  
pooler_port=30012?port=30002  

Datanode1?  
hostname=localhost  
nodename=dn1  
IP=127.0.0.1  
pooler_port=40011, port=40001  

Datanode2?  
hostname=host2  
nodename=dn2  
IP=10.4.6.36  
pooler_port=40012, port=40002
Run Code Online (Sandbox Code Playgroud)

我已经安装了pgxc_ctl并将/ usr/local/pgsql/bin添加PATH for postgres.我已配置ssh身份验证以避免输入pgxc_ctl的密码.我在两个节点上编辑了postgresql.conf和pg_hba.conf.

然后我按如下方式构建了集群:

$ pgxc_ctl
PGXC$  add gtm master gtm localhost 20001 $dataDirRoot/gtm    
PGXC$  add coordinator master coord1 localhost 30001 30011 
       $dataDirRoot/coord_master.1 none none
PGXC$  add coordinator master coord2 10.4.6.36 30002 30012 
       $dataDirRoot/coord_master.2 none none
Run Code Online (Sandbox Code Playgroud)

添加coord2后,我得到以下内容

psql:致命:无法从GTM获取事务ID.GTM可能已失败或丢失连接

PGXC$  add datanode master dn1 localhost …
Run Code Online (Sandbox Code Playgroud)

postgresql postgres-xl postgresql-9.5

7
推荐指数
1
解决办法
638
查看次数

HHVM或PHP5 Zend是否正在运行?

经过一番努力,我终于在Ubuntu中安装了Facebook HipHop虚拟机.它在FastCGI(Apache 2.22)下运行.下面是服务状态:

marcelo@marcelo-VirtualBox:~$ service apache2 status
Apache2 is running (pid 3330).
marcelo@marcelo-VirtualBox:~$ service hhvm status
 * hhvm is running
marcelo@marcelo-VirtualBox:~$ sudo service hhvm restart
 * Restarting HHVM FastCGI Daemon hhvm                                   [ OK ] 
marcelo@marcelo-VirtualBox:~$ 
Run Code Online (Sandbox Code Playgroud)

同一台机器在Apache中启用并配置了PHP5模块.


题:

我想确保我真的PHP使用HHVM和不使用代码Zend Framework.

我的所有PHP脚本都在Web服务器上运行.但是,当我禁用PHP5模块时,使用sudo a2dismod php5Web服务器开始渲染Internal Server Error.

HHVM是否需要启用PHP5模块才能运行?据说,由于我使用的是FastCGI,我的答案是否定的.另一方面,我认为我的页面是由Zend而不是HHVM呈现的.

我在这里错过了什么?我怎样才能确保我真的在运行HHVM?(在我看来,一个明确的测试是禁用PHP5模块,但是,正如我所说,当我禁用时,php停止在Web浏览器中工作).

如果.php未运行且已PHP5 module禁用,是否意味着我的HHVM配置不正确?

PS:我正在测试的脚本是默认的Hello World示例:<?php echo 'Hello World.'; ?>.

并且,当我从命令行运行时它可以工作:

marcelo@marcelo-VirtualBox:/var/www$ sudo hhvm hello_world.php
Hello World.
marcelo@marcelo-VirtualBox:/var/www$ 
Run Code Online (Sandbox Code Playgroud)

编辑

  • Apache …

php apache zend-framework hhvm

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

W3C不验证视口

W3C不会验证我的视口元标记吗,为什么?

<title>DIDIx13</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" /> 
<!-- Throws a warning "Consider avoiding viewport values that prevent users from resizing documents." -->
<meta name="keywords" content="DIDIx13" >
<meta name="description" content="I'm Darwin and welcome to my website" >
Run Code Online (Sandbox Code Playgroud)

html html5 w3c w3c-validation

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

有没有办法在 PowerShell 中居中文本

我们如何在 PowerShell 中居中文本?WindowWidth显然不存在,那么有没有办法以某种方式使文本居中?

我们想要这个输出:

    *
   ***
  *****
 *******
Run Code Online (Sandbox Code Playgroud)

所以我写了

for ($i=1; $i -le 7; $i+=2)
{
  write-host("*" * $i)
}
Run Code Online (Sandbox Code Playgroud)

但我们得到

*
***
*****
*******
Run Code Online (Sandbox Code Playgroud)

powershell

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

要求仅插入数字

所以我正在尝试制作一个简单的计算器.

当我输入第一个数字时,如何进行,但是如果我插入"abc",它将给我一个错误.

当你写"abc"说"请输入一个数字"时,我如何按顺序制作

import java.util.Scanner;

public class calculator 
{
    public static void main(String[] args0) {
        Scanner test = new Scanner(System.in);

        int  x; 
        int  y;
        String  c;

        System.out.println("Insert a number ");
        x = test.nextInt();

        System.out.println("insert a value e.g * / + -");
        c = test.next();

        System.out.println("Insert another number");
        y = test.nextInt();

        if ( c.equals("*")) {
            System.out.println("the total is " + x*y);
        } 

        if (c.equals("+")) {
            System.out.println("the total is " + (x+y));

        }

        if (c.equals("-")) {
            System.out.println("the total is "+ (x-y));
        } …
Run Code Online (Sandbox Code Playgroud)

java

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