OpenID 用户验证如何工作?

2023-12-01

嗯,我正在尝试实现 Steam OpenID 登录到网站,但我不太确定它是如何完成的以及 Steam 如何验证使用 OpenID 登录的用户。

至于现在我发现的是,steam 只返回用户 ID,没有返回任何其他内容,因此对于其余的事情,我必须使用 API 来获取用户的其他信息。

但我不太确定一旦有人通过 OpenID 登录,用户如何在网站上进行验证。

用户从 OpenID 登录后,我是否需要创建会话或设置 cookie 或将用户存储到数据库中?

try {
# Change 'localhost' to your domain name.
$openid = new LightOpenID('http://localhost/openid');
if(!$openid->mode) {
    if(isset($_GET['login'])) {
        $openid->identity = 'http://steamcommunity.com/openid';
        header('Location: ' . $openid->authUrl());
    }
echo '<li><a href="?login"><img border="0" src="http://cdn.steamcommunity.com/public/images/signinthroughsteam/sits_small.png" /></a></li>';
}

elseif($openid->mode == 'cancel') {
    echo 'User has canceled authentication!';
}

else {
    $_SESSION['loged']=1;

    header('Location: http://localhost/openid');

}

if(isset($_SESSION['loged'])) {

echo '<li><a href="?logout">Logout</a></li>';

}
if(isset($_GET['logout'])) {
    unset($_SESSION['loged']);
}

echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';

}

catch(ErrorException $e) {
echo $e->getMessage();
}

我以这段代码为例

我猜想

if(!openid->mode)

意思是如果 openid 没有设置?如果我按下该按钮,我应该显示登录按钮并转到 openid 提供商进行登录

接下来是如果用户不登录则显示取消消息

或者下一部分是如果用户登录,那么由于 openid 只返回用户 id,我需要以某种方式处理他并让他登录在我的网站上,对于这一部分,我应该设置一些会话或 cookie,我确实设置了会话并重定向用户返回主页。

但我不明白一些事情。

为什么我的登录按钮一直显示?

And this

echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';

为什么它不起作用?总是显示用户未登录


这是我用来通过 Steam 的 OpenID 进行身份验证的代码

<?php
require 'includes/lightopenid/openid.php';
$_STEAMAPI = "YOURSTEAMAPIKEY";

// CHECK IF COOKIE EXISTS WITH PROFILE ID. IF NOT, LOG THE USER IN

try 
{
    $openid = new LightOpenID('http://URL.TO.REDIRECT.TO.AFTER.LOGIN/');
    if(!$openid->mode) 
    {
        if(isset($_GET['login'])) 
        {
            $openid->identity = 'http://steamcommunity.com/openid/?l=english';    // This is forcing english because it has a weird habit of selecting a random language otherwise
            header('Location: ' . $openid->authUrl());
        }
?>
<form action="?login" method="post">
    <input type="image" src="http://cdn.steamcommunity.com/public/images/signinthroughsteam/sits_small.png">
</form>
<?php
    } 
    elseif($openid->mode == 'cancel') 
    {
        echo 'User has canceled authentication!';
    } 
    else 
    {
        if($openid->validate()) 
        {
                $id = $openid->identity;
                // identity is something like: http://steamcommunity.com/openid/id/76561197960435530
                // we only care about the unique account ID at the end of the URL.
                $ptn = "/^http:\/\/steamcommunity\.com\/openid\/id\/(7[0-9]{15,25}+)$/";
                preg_match($ptn, $id, $matches);
                echo "User is logged in (steamID: $matches[1])\n";
                // HERE YOU CAN SET A COOKIE, SAVE TO A DATABASE, CREATE A SESSION, ETC.

                // This is an example of what you can do once you have the profile id    
                $url = "http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=$_STEAMAPI&steamids=$matches[1]";
                $json_object= file_get_contents($url);
                $json_decoded = json_decode($json_object);

                foreach ($json_decoded->response->players as $player)
                {
                    echo "
                    <br/>Player ID: $player->steamid
                    <br/>Player Name: $player->personaname
                    <br/>Profile URL: $player->profileurl
                    <br/>SmallAvatar: <img src='$player->avatar'/> 
                    <br/>MediumAvatar: <img src='$player->avatarmedium'/> 
                    <br/>LargeAvatar: <img src='$player->avatarfull'/> 
                    ";
                }

        } 
        else 
        {
                echo "User is not logged in.\n";
        }
    }
} 
catch(ErrorException $e) 
{
    echo $e->getMessage();
}
?>

这将为用户提供一个 Steam 登录 ID 按钮,单击该按钮会将用户重定向到 Steam 社区登录页面。登录后,用户将被发送回您的域。这是 LightOpenID 构造函数中设置的内容。如果用户已通过验证,它将从返回值中提取唯一的玩家 ID。返回值看起来像http://steamcommunity.com/openid/id/76561194350435530,你只需要76561194350435530部分。使用它,您可以查询任何采用配置文件 ID 的 Valve API。

设置 cookie 和会话可以在登录过程结束时完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenID 用户验证如何工作? 的相关文章

  • PHP - 多个不同的数据库依赖注入类

    我花了过去几个小时试图找到 最佳 最合乎逻辑的方法的答案 以编写一个 php 数据库类以同时连接到一个 postgresql 数据库和一个 mysql 数据库 另外 我想采用依赖注入设计 但对整个概念还是陌生的 到目前为止我已经想出了 cl
  • 将数据插入多个表 PHP MySQL

    我有一个用于存储食谱的基本数据结构 它由三个表组成 如下所示 表 1 食谱 recipe id recipe name 表 2 成分 成分 ID 成分名称 表 3 配方 成分 配方 id 成分 id 我在添加新配方时遇到问题 想知道插入的最
  • mysqli_result 无法转换为 int [重复]

    这个问题在这里已经有答案了 我想将 SQL COUNT 的结果存储在变量中 然后将它们相除 但是出现错误 注意 类 mysqli result 的对象在 中无法转换为 int countrows SELECT count AS NumRow
  • Laravel ErrorException:未定义的变量:\storage\framework\views\ 中的错误

    我尝试使用 redis 队列来延迟发送邮件 但每次都会收到错误 ErrorException 未定义的变量 错误 C wamp64 www laravel boltra storage framework views c653bafa95f
  • jQuery - 找不到 ajax url

    好吧 我确信这真的很容易 而且我很愚蠢 但似乎无法弄清楚它的真相 我正在尝试从名为 custom js 的 js 文件对 helpers php 中的某些代码进行简单的 AJAX 调用 然而 我不断收到 404 错误 因为我似乎没有正确遍历
  • Wordpress 数组显示特定类别的帖子并显示帖子摘录和功能

    大家好 正在寻找 WordPress 帮助 我需要放置一个简单的查询 数组来显示来自某只猫的帖子 例如 新闻 其中将包含帖子特色图像 有人可以帮忙吗 Gary Try this a href title a
  • 如何在 Express 4.0 中发送 Flash 消息?

    因此 我的 Web 应用程序需要身份验证 并且我有一个注册页面 如果用户尝试使用数据库中已有的电子邮件进行注册 我想向他们显示一条错误消息 我正在尝试在 html 端使用此代码来执行此操作 div class alert alert dan
  • 如何加密然后解密数据库类文件中使用的用户名和密码文本

    我创建了一个类文件database php 它处理所有sql 查询并连接到数据库 我将数据库的用户名和密码存储在一个变量中 如果可以访问 php 文件 很容易看到 我想加密该用户名和密码 这样即使在拥有该 php 文件之后 人们也无法知道原
  • 为什么服务器端和客户端脚本无法交互?

    我是客户端和服务器端脚本的新手 我想知道它们为什么不能交互 Code Conquest 指出的主要区别here http www codeconquest com website client side vs server side 就是它
  • Prestashop 1.6 自定义模块未显示在前端

    我的模块没有显示在前端 我按照这个链接 doc prestashop com display PS15 Creating a PrestaShop module 在 prestashop 1 6 中创建自定义模块 我已经检查了位置 清除并禁
  • time() 会返回相同的输出吗?

    当用户注册时 我正在为 PHP 中的用户生成令牌 我想知道两个用户是否可以获得相同的令牌 因为这会破坏系统 请让我知道这是否足够 token md5 rand time 编辑 我现在正在使用我在另一个问题上找到的generate uuid
  • PHP:如何删除“[”和“]”之间的字符串

    我需要删除 内的字符串 包括 本身 我尝试从该网站寻找解决方案 我有一个线索 我应该尝试使用 preg replace 进行一些操作 但它对我来说似乎太专业了 例如 gallery ids 92 93 94 95 96 97 98 99 1
  • Cake PHP 中的自定义分页

    我是 cakePHP 的初学者 我不想在 cakePHP 中创建自定义分页 功能 paginator gt numbers 它显示的页码如下 1 2 3 4 通过查看选项 有一些选项可以更改分隔符 添加样式类 css 等等 我想要的是这样的
  • 流浪家园慢

    我有一个基于 Laravel Homestead 的 vagrant 服务器 用于在本地测试我的 Laravel 站点 大部分情况下它运行得很好 然而 最近 我遇到了问题 它会停止几分钟 典型 到几个小时 罕见 这种情况每 15 分钟左右就
  • 从 Woocommerce 商店页面中的特定自定义元数据中过滤产品

    我需要过滤 WooCommerce 商店页面 并且只想显示需要自定义产品元数据的产品 这是我在archive product php Hook woocommerce before shop loop hooked wc print not
  • 在 Rails 5 控制器集成测试中设置 cookie.signed

    想象一下这样的场景 有一个控制器集成测试调用一个控制器方法 其中cookie signed用于一些完整性检查 控制器 app controllers foo controller rb def index entity FooEntity
  • 用正则表达式动态替换部分条件块

    有一个字符串 格式为 else if rule somerule1 echo s 1 n name surname else if rule somerule2 echo s 1 n another text here s 只能有数字 n
  • 扫描图像到可读文本

    我想知道是否有一种方法可以通过编写代码来将带有文本的扫描图像转换为可读文本 那可能吗 OCRTools http www ocrtools com是我用于 net 的 对于Java 我用过Aspire http asprise com pr
  • XPath 节点到字符串

    如何选择以下节点的字符串内容 span class url word b class test b span span class url word b class test2 b more words span 我尝试过一些事情 span
  • ZipArchive::extractTo 不创建 zip 文件名称的子目录

    我有一个名为myzip zip 它包含 myzip file1 png and myzip subdirectory file2 png 我希望将其提取到 home me somedirectory所以我尝试 zip gt extractT

随机推荐

  • 在 Java 中创建悬空指针

    如何在 Java 中创建悬空指针 根据维基百科的定义 below no 计算机编程中的悬空指针和野指针是不指向适当类型的有效对象的指针 当删除或释放对象而不修改指针的值时 会出现悬空指针 这样指针仍然指向已释放内存的内存位置
  • 计算特定组的相对频率

    我有一个分类变量的 data frame 我已将其分为几组 并且获得了每组的计数 My original data nyD looks like Source local data frame 7 x 3 Groups v1 v2 v3 v
  • 停止活动中的服务

    我正在使用以下代码来停止我的服务 Intent intent new Intent MainActivity this UsageRecorderService class stopService intent 这是我的无限期服务 publ
  • 可视化编程工具

    我需要用于图形表示程序中的工作流程的工具 就像用图形表示描述电子电路一样 表示必须如下所示 函数是框 框之间的箭头是 消息 像这样 替代文本http img372 imageshack us img372 8471 functionsqv0
  • 如何减去ivy依赖集

    我的目标是将项目传递依赖关系划分为几个不交叉的集合 系统 j2ee 容器中已存在 jar 使用显式固定版本手动列出 提供 要复制到 j2ee 容器的 jar 手动列出 Ear jars 装在 Ear lib 内 其余的 下面列出的我当前的解
  • 在我的应用程序中嵌入 App Store

    我在 App Store 中看到允许您下载其他游戏的游戏 它不是将应用程序切换到应用程序商店来下载其他游戏 而是在应用程序本身中打开一个嵌入式应用程序商店 Zoo Country 就是执行此操作的应用程序的一个示例 据我所知 将某人带到应用
  • 成功安装 libtiff 但在导入时出现错误

    我使用 pip install libtiff 在 python 2 7 中成功安装了 libtiff 它成功安装了 libtiff 0 4 0 软件包 但是当我使用 import libtiff 导入包时 我收到一个错误 Tracebac
  • 将整数数组传递给 mysql 过程

    我想创建一个存储过程 它接收整数数组和一些其他输入 例如 CREATE PROCEDURE test field1 varchar 4 field2 varchar 4 array varchar 255 在存储过程中我想像这样使用它 WH
  • 将两个 SQL 查询的结果合并为单独的列

    我有两个查询返回单独的结果集 并且查询返回正确的输出 如何将这两个查询合并为一个 以便获得一个结果集 每个结果位于单独的列中 Query 1 SELECT SUM Fdays AS fDaysSum From tblFieldDays WH
  • 动态 Python 数组切片

    我面临的情况是我有一个非常大的numpy ndarray 实际上 这是一个 hdf5 数据集 我需要快速找到它的子集 因为它们整个数组无法保存在内存中 但是 我也不想迭代这样的数组 即使声明内置的 numpy 迭代器也会抛出一个Memory
  • 将周末插入仅包含工作日 MS Access 的表中

    我需要将周末插入只有工作日的表中 然后将最后一个已知值分配给周末值 我知道我需要插入查询 尽管我对 VBA 和 SQL 还很陌生 到目前为止的代码 Private Sub btnWeekends Click DoCmd SetWarning
  • 如何使用 webmethods 更新数据网格

    我选择使用 javascript PageMethod 和 WebMethod 每秒更新数据的方法 通过一个对象获得很多回报 如果它是 naeccasery 我可以设置数百个标签 2 个完整的数据库查询时间低于 200 毫秒 并且后期权重非
  • Emacs:防弹上行列表?

    我越来越up list Scan error Unbalanced parentheses 从这个位置 foo bar 片段来自up list doc 此命令假设点不在字符串或注释中 所以这是预期的行为 但我不在乎 我只想从列表中向上移动
  • 使用 MDM + Enterprise 许可证自动更新 iOS 应用程序

    我们有一个以信息亭模式运行的 iPad 应用程序 部署在多个物理位置 我们希望有一个解决方案 可以将应用程序的任何更新自动推送到设备 这样客户就不必触摸他们拥有的每台 iPad 我们的客户有一个现有的 MDM 软件 如果有更新 它会通知用户
  • Windows IoT Raspberry Pi 3 c# 创建.txt 文件

    我正在使用带有 Win IoT 的 Raspberry Pi 3 我正在尝试创建一个以数据和时间作为文件名的 txt 文件 但是 我似乎无法创建 txt 文件 我正在通过按按钮生成 log txt 文件进行测试 按下按钮后 没有错误消息 当
  • FtpWebRequest 使用进度条进行 FTP 下载

    我的代码有效 但是ProgressBar直接跳到100 然后继续下载 当它完成后 就会出现一个消息框来获取信息 我已经改变了缓冲区大小 但这并不重要 我在这里做错了什么 这是我的代码 void workerDOWN DoWork objec
  • 如何从 ItemTemplate XAML 绑定到 HierarchicalDataTemplate 的 DataContext?

    在我的 WPF TreeView 中 我定义了一个HierarchicalDataTemplate 在其ItemTemplate 有一个按钮 其Command我需要绑定到父 ViewModel 这是DataContext父母的Hierarc
  • 2017 年使用 IBDesignable 绘制虚线(不是虚线!)

    很容易画出一个dashed与 UIKit 一致 所以 CGFloat dashes 4 2 path setLineDash dashes count 2 phase 0 path stroke 有什么办法可以画出真正的虚线吗 将线帽样式设
  • 为什么 Java 允许将字符串文字分配给 String 对象?

    String是java中的一个类 在声明和分配字符串时 正确的说法是字符串名称 Paul 虽然要从 java 类实例化对象 但我们这样做字符串名称 new String 以名字作为对象 我想知道为什么我们可以将一系列字符 Paul 分配给该
  • OpenID 用户验证如何工作?

    嗯 我正在尝试实现 Steam OpenID 登录到网站 但我不太确定它是如何完成的以及 Steam 如何验证使用 OpenID 登录的用户 至于现在我发现的是 steam 只返回用户 ID 没有返回任何其他内容 因此对于其余的事情 我必须