OAuth 2.0 PHP客户端和服务器示例

26

我下载了针对OAuth 2.0的服务器版(PDO),可以在这里找到。

说实话,我不确定这是最好的实现方式。

它已经配置好,并且目前返回一个错误JSON,指示它正在等待客户端传递正确的参数。

现在,它带有一个"lib"文件夹,其中包含一个Client .inc文件。老实说,我不知道该如何使用它,因为在存档中没有找到PHP示例,也找不到任何在线信息。我找到了一个使用此库的Drupal示例,但它很混乱,因为他们有自己的与Drupal相关的功能作为模块。

我想知道是否有人在这里能够成功使用这个PHP客户端库,如果有,他们能否分享一个连接、授权并重定向到回调URL的示例,以及会话来访问受保护的页面/ API调用?

我想尝试使用Facebook Graph API(开放源代码),但我发现它非常适合Facebook,而且不太确定应该将安装在我自己的服务器上的OAuth 2.0服务器的URL放在哪里。


1
可能是重复的问题:设置PHP OAuth提供程序 - Noah Goodrich
这并不是重复的问题。Noah提到的问题是关于OAuth 1.0的,而这个问题是关于OAuth 2.0的,两者完全不同。 - MerchantProtocol.com
有人能够解决如何设置PHP OAuth提供者的问题吗? - Uzair Sajid
@UzairSajid:我之前写过一个。可以从这个代码中获得灵感吗?https://github.com/srenauld/laravel-oauth2-server - Sébastien Renauld
@SébastienRenauld 我最后也是根据我找到的一个Draft 10实现,编写了自己的Codeigniter库。 - Uzair Sajid
请查看以下链接以获取与OAuth2相关的编程内容:https://github.com/bshaffer/oauth2-demo-php - Rohit Suthar
5个回答

50

一旦你知道OAuth2协议的工作原理,设置OAuth2提供程序就非常容易。这是一个2或3步骤的过程(取决于你的设置以及你是否代表用户获取令牌还是只从服务器获取令牌)。

你需要:

  • OAuth2提供程序的工作代码
  • 耐心

你需要在你的代码中找出如何进行以下操作:

  • 创建客户端(公共和私有访问令牌)
  • 找出授权和令牌终点的名称(通常为/authorize/token
  • 了解如何处理作用域

获取令牌的第一步是调用/authorize?response_type=code&client_id=[YOUR ID]&redirect_uri=[YOUR REDIRECT URI]&scope=[YOUR SCOPE],其中:

  • clientid ([YOUR ID])是你的公共访问令牌
  • redirect_uri ([YOUR REDIRECT URI])是你的重定向URI。完成授权步骤后,你将被重定向到该URI
  • scope是你未来令牌的范围

完成后(通常有一个提交按钮),你的浏览器将被重定向到指定的URI,并在URL中带有一个代码(code = blah)。保存这个值。

当你获得了这个代码后,调用另一个终点:/token?client_id=[YOUR ID]&client_secret=[YOUR SECRET]&grant_type=authorization_code&scope=[YOUR SCOPE]&code=[YOUR CODE]&redirect_uri=[YOUR REDIRECT URI]

参数: - client_id - 再次是你的客户端公钥 - client_secret - 你的私钥(这应该是一个服务器端调用) - scope - 令牌的范围 - 必须与第一次调用相匹配 - redirect_uri - 重定向URI - 必须与第一次调用相匹配 - code - 你收到的代码

如果一切顺利,你将在屏幕上看到包含令牌信息的JSON对象。

后台发生了什么

步骤1(授权)

当您确认表格时,服务器会创建一个临时令牌(称为授权令牌),其寿命通常非常短(我的oauth2 sp代码通常设置为60秒)。这是您的服务器从接收代码到触发第2步所需的时间。它只是一个确认系统,其目的还包括存储步骤1中提供的信息以防止劫持。

步骤2(令牌)

这是您实际创建访问令牌的地方。大量验证,大量处理,但最终,令牌只是将您的client_id和令牌链接在一起的值。这就是全部。

无耻的宣传:如果您正在使用Laravel框架,我已经从头开始构建了这个功能(而不是使用糟糕的,未记录的示例代码):http://bundles.laravel.com/bundle/oauth2-sp


@Red2678:OP从未回来。 - Sébastien Renauld

7

5

我正在开发一个PHP客户端,它能够做到以下几点:

  • 监听套接字
  • 进行身份认证 -> 发出请求
  • 服务器端规则对身份认证流程进行处理
  • 返回身份认证结果作为响应
  • 根据响应处理客户端需求

简短回答是: curl + JSON

所有的身份认证流程都由curl发送到我的服务器端脚本,该脚本接受身份认证变量、进行处理和比较,最后将包含多个变量的响应用'JSON编码'的格式返回给客户端。客户端在获取到响应后,会将其解码成独立的变量,从而了解如何为该客户端执行操作。

然后,向当前已通过身份验证的用户(由Session指定)提供一些工具。所有的工作都在PHP Desktop中进行,这是一个带有PHP和curl支持的嵌入式Mongoose Web服务器。实际上,不需要使用任何库,因为PHP自带完整的库。使用curl、JSON以及服务器端的PHP、MySQL(条件检查)就足以进行身份认证。


0
我对你的问题有些困惑。你说“它已经配置好并返回一个错误的JSON,表明它正在等待客户端传递正确的参数”,但是你想要一个“连接、授权,然后重定向到回调URL”的示例?如果你已经准备好接受请求,应该可以使用jQuery Ajax请求(使用授权头)来发出请求。只要你插入了适当的client_id和client_secret,它就应该返回你的Web API设置要转储的任何内容。

0

pdo_oauth示例代码中存在错误。秘钥没有保存到数据库中,这可能是你遇到问题的原因。

需要将pdo_oauth.php文件中第45行更改为:

 $stmt->bindParam(":pw", $pw, PDO::PARAM_STR);

to:

 $stmt->bindParam(":pw", $secret, PDO::PARAM_STR);

Adam


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接