PHP身份认证服务可以使用Radius软件包来实现。该软件包基于FreeBSD的libradius,允许客户端通过向远程服务器发出网络请求来执行身份验证和记账。同时,PECL扩展为Radius身份验证(RFC 2865)和Radius会计(RFC 2866)提供了全面支持。该软件包适用于Unix系统,已经在FreeBSD和Linux上进行了测试,同时也支持Windows操作系统。
一、预定义常量
1、RADIUS选项
有几个 RADIUS 函数接受选项标志作为位掩码,下面列出了代表这些标志的常量:
- RADIUS_OPTION_SALT (int):设置该选项后,属性值将被盐加密;
- RADIUS_OPTION_TAGGED (int):设置该选项后,属性值将被标记为标签参数的值。
2、RADIUS数据包类型
- RADIUS 数据包(无论是请求还是响应)始终包含一种类型。这些 提供常量是为了在使用radius_create_request() 和比较 radius_send_request() 的结果时更容易指定类型;
- RADIUS_ACCESS_REQUEST (int):访问请求,用于针对 RADIUS 服务器对用户进行身份验证。 访问请求数据包必须包含RADIUS_NAS_IP_ADDRESS或RADIUS_NAS_IDENTIFIER属性,还必须包含RADIUS_USER_PASSWORD、RADIUS_CHAP_PASSWORD或RADIUS_STATE属性,并且应包含RADIUS_USER_NAME属性;
- RADIUS_ACCESS_ACCEPT (int):对 Access-Request 的 Access-Accept 响应,指示 RADIUS 服务器已成功对用户进行身份验证;
- RADIUS_ACCESS_REJECT (int):对 Access-Request 的 Access-Reject 响应,指示 RADIUS 服务器无法对用户进行身份验证;
- RADIUS_ACCESS_CHALLENGE (int):对 Access-Request 的 Access-Challenge 响应,指示 RADIUS 服务器需要在另一个访问请求中提供更多信息 在对用户进行身份验证之前;
- RADIUS_ACCOUNTING_REQUEST (int):会计请求,用于传达会计信息 服务到 RADIUS 服务器;
- RADIUS_ACCOUNTING_RESPONSE (int):对 Accounting-Request 的 Accounting-Response 响应;
- RADIUS_COA_REQUEST (int):CoA 请求,从 RADIUS 服务器发送,以指示 用户会话中的授权已更改。响应必须是 以 CoA-ACK 或 CoA-NAK 的形式发送。此常量在 PECL radius 1.3.0 及更高版本中可用;
- RADIUS_COA_ACK (int):发送到 RADIUS 服务器的 CoA-ACK,以指示用户 授权已更新。此常量在 PECL radius 1.3.0 及更高版本中可用;
- RADIUS_COA_NAK (int):发送到 RADIUS 服务器以指示用户的 CoA-NAK 无法更新授权。此常量在 PECL radius 1.3.0 及更高版本中可用;
- RADIUS_DISCONNECT_REQUEST (int):从 RADIUS 服务器发送的 Disconnect-Request,用于指示 必须终止用户会话。此常量在 PECL radius 1.3.0 及更高版本中可用;
- RADIUS_DISCONNECT_ACK (int):Disconnect-ACK,发送到 RADIUS 服务器以指示用户 会话已终止。此常量在 PECL radius 1.3.0 及更高版本中可用;
- RADIUS_DISCONNECT_NAK (int):发送到 RADIUS 服务器的 Disconnect-NAK,以指示用户 会话无法终止。此常量在 PECL radius 1.3.0 及更高版本中可用。
3、RADIUS属性类型
- 这些常量定义可与 radius_put_addr()、radius_put_attr()、radius_put_int() 和 radius_put_string() 一起使用的 RADIUS 属性类型;
- RADIUS_USER_NAME (int):User-Name 属性。属性值应为包含要进行身份验证的用户的名称的字符串, 并且可以使用 radius_put_attr() 进行设置;
- RADIUS_USER_PASSWORD (int):User-Password 属性。属性值应为包含用户密码的字符串,可以使用 radius_put_attr() 进行设置;
- RADIUS_CHAP_PASSWORD (int):Chap-Password 属性。属性值应为第一个字节包含 CHAP 标识符的字符串, 以及随后的 16 个字节,其中包含 CHAP 的 MD5 哈希值 identifier、明文密码和 CHAP 质询值 连接在一起。请注意,CHAP 质询值也应为 在 RADIUS_CHAP_CHALLENGE 属性中单独发送;
示例:Using CHAP passwords
<?php // Firstly, we'll create an authentication handle and request. $radh = radius_auth_open(); radius_add_server($radh, $server, $port, $secret, 3, 3); radius_create_request($radh, RADIUS_ACCESS_REQUEST); // Assuming $password contains the plaintext password, we now: // Generate a challenge. $challenge = mt_rand(); // Specify a CHAP identifier. $ident = 1; // Add the Chap-Password attribute. $cp = md5(pack('Ca*', $ident, $password.$challenge), true); radius_put_attr($radh, RADIUS_CHAP_PASSWORD, pack('C', $ident).$cp); // Add the Chap-Challenge attribute. radius_put_attr($radh, RADIUS_CHAP_CHALLENGE, $challenge); /* From here, you would add the remaining attributes and * call radius_send_request(). */ ?>
- RADIUS_NAS_IP_ADDRESS (int):NAS-IP-Address 属性。属性值应为 IP 编码为 int 的 RADIUS 客户端的地址,其中 可以使用 radius_put_addr() 进行设置;
- RADIUS_NAS_PORT (int):NAS-Port 属性。属性值应为 用户在 RADIUS 客户端上的物理端口编码为 int,可以使用 radius_put_int() 进行设置;
- RADIUS_SERVICE_TYPE (int):Service-Type 属性。属性值指示服务 键入用户请求的类型,并且应为 int,可以使用 radius_put_int() 进行设置;
提供了许多常量来表示 此属性。它们包括:
- RADIUS_LOGIN
- RADIUS_FRAMED
- RADIUS_CALLBACK_LOGIN
- RADIUS_CALLBACK_FRAMED
- RADIUS_OUTBOUND
- RADIUS_ADMINISTRATIVE
- RADIUS_NAS_PROMPT
- RADIUS_AUTHENTICATE_ONLY
- RADIUS_CALLBACK_NAS_PROMPT
- RADIUS_FRAMED_PROTOCOL (int):Framed-Protocol 属性。属性值应为 int,指示要用于 framed 的帧 access,并且可以使用 radius_put_int() 进行设置。这 可能的属性值包括以下常量:
- RADIUS_PPP
- RADIUS_SLIP
- RADIUS_ARAP
- RADIUS_GANDALF
- RADIUS_XYLOGICS
- RADIUS_FRAMED_IP_ADDRESS (int):Framed-IP-Address 属性。属性值应为 编码为 int 的用户网络地址, 可以使用 radius_put_addr() 和 使用 radius_cvt_addr() 检索;
- RADIUS_FRAMED_IP_NETMASK (int):Framed-IP-Netmask 属性。属性值应为 编码为 int 的用户网络的网络掩码, 可以使用 radius_put_addr() 和 使用 radius_cvt_addr() 检索;
- RADIUS_FRAMED_ROUTING (int):Framed-Routing 属性。属性值应为指示用户的路由方法的 int,该 可以使用 radius_put_int() 进行设置。
可能的值包括:
- 0:无路由
- 1:发送路由数据包
- 2:侦听路由数据包
- 3:发送和收听
- RADIUS_FILTER_ID (int):Filter-ID 属性。属性值应为 特定于实现的、人类可读的过滤器字符串, 可以使用 radius_put_attr() 进行设置;
- RADIUS_FRAMED_MTU (int):Framed-MTU 属性。属性值应为 int,指示要为用户配置的 MTU, 并且可以使用 radius_put_int() 进行设置;
- RADIUS_FRAMED_COMPRESSION (int):Framed-Compression 属性。属性值应为 一个 int 表示要使用的压缩协议, 并且可以使用 radius_put_int() 进行设置。可能 值包括以下常量:
- RADIUS_COMP_NONE:无压缩
- RADIUS_COMP_VJ:VJ TCP/IP 报头压缩
- RADIUS_COMP_IPXHDR:IPX 标头压缩
- RADIUS_COMP_STAC_LZS: Stac-LZS 压缩(在 PECL 半径 1.3.0b2 中添加)
- RADIUS_LOGIN_IP_HOST (int):Login-IP-Host 属性。属性值应为 IP 将用户连接到的地址,编码为 int, 可以使用 radius_put_addr() 进行设置;
- RADIUS_LOGIN_SERVICE (int):Login-Service 属性。属性值是一个 int,指示要将用户连接到的服务 on 登录主机。该值可以通过 radius_cvt_int() 转换为 PHP 整数;
- RADIUS_LOGIN_TCP_PORT (int):Login-TCP-Port 属性。属性值是一个 int,指示要将用户连接到的端口 登录主机。该值可以通过 radius_cvt_int() 转换为 PHP 整数;
- RADIUS_REPLY_MESSAGE (int):Reply-Message 属性。属性值是一个字符串,其中包含可在 对访问请求的响应;
- RADIUS_CALLBACK_NUMBER (int):Callback-Number 属性。属性值是一个字符串,其中包含要用于回调的拨号字符串;
- RADIUS_CALLBACK_ID (int):Callback-Id 属性。属性值是一个字符串,其中包含要调用的位置的特定于实现的名称;
- RADIUS_FRAMED_ROUTE (int):Framed-Route 属性。属性值是一个字符串,其中包含要为其配置的一组特定于实现的路由 用户;
- RADIUS_FRAMED_IPX_NETWORK (int):Framed-IPX-Network 属性。属性值是一个 int,其中包含要为 user,或指示 RADIUS 客户端应选择网络,并可通过 radius_cvt_int() 访问;
- RADIUS_STATE (int):State 属性。属性值是来自服务器的 Access-Challenge 中包含的实现定义的字符串,该字符串 必须包含在后续的访问请求中,并且可以使用 radius_put_attr() 进行设置;
- RADIUS_CLASS (int):Class 属性。属性值是包含在 Access-Accept 消息中的任意字符串,该字符串应 然后在 Accounting-Request 消息中发送到记帐服务器, 并且可以使用 radius_put_attr() 进行设置;
- RADIUS_VENDOR_SPECIFIC (int):特定于供应商的属性。通常,供应商属性值 应使用 radius_put_vendor_addr()、radius_put_vendor_attr()、radius_put_vendor_int() 和 radius_put_vendor_string() 进行设置,而不是直接设置;此常量在解释特定于供应商时最有用 来自 RADIUS 服务器的响应中的属性;当供应商特定时 属性,则应使用 radius_get_vendor_attr() 函数来访问供应商 ID、属性类型和 属性值。
- RADIUS_SESSION_TIMEOUT (int):会话超时;
- RADIUS_IDLE_TIMEOUT (int):空闲超时;
- RADIUS_TERMINATION_ACTION (int):终止操作;
- RADIUS_CALLED_STATION_ID (int):被叫站 ID;
- RADIUS_CALLING_STATION_ID (int):呼叫站 ID;
- RADIUS_NAS_IDENTIFIER (int):NAS ID;
- RADIUS_PROXY_STATE (int):代理状态;
- RADIUS_LOGIN_LAT_SERVICE (int):登录LAT服务;
- RADIUS_LOGIN_LAT_NODE (int):登录 LAT 节点;
- RADIUS_LOGIN_LAT_GROUP (int):登录 LAT 组;
- RADIUS_FRAMED_APPLETALK_LINK (int):带框的 Appletalk 链接;
- RADIUS_FRAMED_APPLETALK_NETWORK (int):框架 Appletalk 网络;
- RADIUS_FRAMED_APPLETALK_ZONE (int):带框的Appletalk专区;
- RADIUS_CHAP_CHALLENGE (int):挑战;
- RADIUS_NAS_PORT_TYPE (int):NAS端口类型,其中一种:
- RADIUS_ASYNC
- RADIUS_SYNC
- RADIUS_ISDN_SYNC
- RADIUS_ISDN_ASYNC_V120
- RADIUS_ISDN_ASYNC_V110
- RADIUS_VIRTUAL
- RADIUS_PIAFS
- RADIUS_HDLC_CLEAR_CHANNEL
- RADIUS_X_25
- RADIUS_X_75
- RADIUS_G_3_FAX
- RADIUS_SDSL
- RADIUS_ADSL_CAP
- RADIUS_ADSL_DMT
- RADIUS_IDSL
- RADIUS_ETHERNET
- RADIUS_XDSL
- RADIUS_CABLE
- RADIUS_WIRELESS_OTHER
- RADIUS_WIRELESS_IEEE_802_11
- RADIUS_PORT_LIMIT (int):端口限制;
- RADIUS_LOGIN_LAT_PORT (int):登录LAT端口;
- RADIUS_CONNECT_INFO (int):连接信息;
- RADIUS_ACCT_STATUS_TYPE (int):会计状态类型,以下之一:
- RADIUS_START
- RADIUS_STOP
- RADIUS_ACCOUNTING_ON
- RADIUS_ACCOUNTING_OFF
- RADIUS_ACCT_DELAY_TIME (int):记帐延迟时间;
- RADIUS_ACCT_INPUT_OCTETS (int):记帐输入字节数;
- RADIUS_ACCT_OUTPUT_OCTETS (int):记帐输出字节数;
- RADIUS_ACCT_SESSION_ID (int):记帐会话 ID;
- RADIUS_ACCT_AUTHENTIC (int):会计正宗,以下之一:
- RADIUS_AUTH_RADIUS
- RADIUS_AUTH_LOCAL
- RADIUS_AUTH_REMOTE
- RADIUS_ACCT_SESSION_TIME (int):会计会话时间;
- RADIUS_ACCT_INPUT_PACKETS (int):记帐输入数据包;
- RADIUS_ACCT_OUTPUT_PACKETS (int):记帐输出数据包;
- RADIUS_ACCT_TERMINATE_CAUSE (int):会计终止原因之一:
- RADIUS_TERM_USER_REQUEST
- RADIUS_TERM_LOST_CARRIER
- RADIUS_TERM_LOST_SERVICE
- RADIUS_TERM_IDLE_TIMEOUT
- RADIUS_TERM_SESSION_TIMEOUT
- RADIUS_TERM_ADMIN_RESET
- RADIUS_TERM_ADMIN_REBOOT
- RADIUS_TERM_PORT_ERROR
- RADIUS_TERM_NAS_ERROR
- RADIUS_TERM_NAS_REQUEST
- RADIUS_TERM_NAS_REBOOT
- RADIUS_TERM_PORT_UNNEEDED
- RADIUS_TERM_PORT_PREEMPTED
- RADIUS_TERM_PORT_SUSPENDED
- RADIUS_TERM_SERVICE_UNAVAILABLE
- RADIUS_TERM_CALLBACK
- RADIUS_TERM_USER_ERROR
- RADIUS_TERM_HOST_REQUEST
- RADIUS_ACCT_MULTI_SESSION_ID (int):记帐多会话 ID;
- RADIUS_ACCT_LINK_COUNT (int):记帐链接计数。
4、RADIUS供应商特定属性类型
RADIUS_VENDOR_MICROSOFT (整数):Microsoft 特定供应商属性 (» RFC 2548),以下属性之一。
- RADIUS_MICROSOFT_MS_CHAP_RESPONSE
- RADIUS_MICROSOFT_MS_CHAP_ERROR
- RADIUS_MICROSOFT_MS_CHAP_PW_1
- RADIUS_MICROSOFT_MS_CHAP_PW_2
- RADIUS_MICROSOFT_MS_CHAP_LM_ENC_PW
- RADIUS_MICROSOFT_MS_CHAP_NT_ENC_PW
- RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_POLICY
- RADIUS_MICROSOFT_MS_MPPE_ENCRYPTION_TYPES
- RADIUS_MICROSOFT_MS_RAS_VENDOR
- RADIUS_MICROSOFT_MS_CHAP_DOMAIN
- RADIUS_MICROSOFT_MS_CHAP_CHALLENGE
- RADIUS_MICROSOFT_MS_CHAP_MPPE_KEYS
- RADIUS_MICROSOFT_MS_BAP_USAGE
- RADIUS_MICROSOFT_MS_LINK_UTILIZATION_THRESHOLD
- RADIUS_MICROSOFT_MS_LINK_DROP_TIME_LIMIT
- RADIUS_MICROSOFT_MS_MPPE_SEND_KEY
- RADIUS_MICROSOFT_MS_MPPE_RECV_KEY
- RADIUS_MICROSOFT_MS_RAS_VERSION
- RADIUS_MICROSOFT_MS_OLD_ARAP_PASSWORD
- RADIUS_MICROSOFT_MS_NEW_ARAP_PASSWORD
- RADIUS_MICROSOFT_MS_ARAP_PASSWORD_CHANGE_REASON
- RADIUS_MICROSOFT_MS_FILTER
- RADIUS_MICROSOFT_MS_ACCT_AUTH_TYPE
- RADIUS_MICROSOFT_MS_ACCT_EAP_TYPE
- RADIUS_MICROSOFT_MS_CHAP2_RESPONSE
- RADIUS_MICROSOFT_MS_CHAP2_SUCCESS
- RADIUS_MICROSOFT_MS_CHAP2_PW
- RADIUS_MICROSOFT_MS_PRIMARY_DNS_SERVER
- RADIUS_MICROSOFT_MS_SECONDARY_DNS_SERVER
- RADIUS_MICROSOFT_MS_PRIMARY_NBNS_SERVER
- RADIUS_MICROSOFT_MS_SECONDARY_NBNS_SERVER
- RADIUS_MICROSOFT_MS_ARAP_CHALLENGE
二、Radius函数
Radius函数和对应含义如下:
- radius_acct_open — 创建用于记帐的 Radius 句柄;
- radius_add_server — 添加服务器;
- radius_auth_open — 创建用于身份验证的 Radius 句柄;
- radius_close — 释放所有资源;
- radius_config — 使库读取给定的配置文件;
- radius_create_request — 创建记帐或身份验证请求;
- radius_cvt_addr — 将原始数据转换为IP地址;
- radius_cvt_int — 将原始数据转换为整数;
- radius_cvt_string — 将原始数据转换为字符串;
- radius_demangle_mppe_key — 从损坏的数据中派生 mppe 密钥;
- radius_demangle — 去解数据;
- radius_get_attr — 提取属性;
- radius_get_tagged_attr_data — 从标记属性中提取数据;
- radius_get_tagged_attr_tag — 从标记属性中提取标签;
- radius_get_vendor_attr — 提取供应商特定属性;
- radius_put_addr — 附加IP地址属性;
- radius_put_attr — 附加二进制属性;
- radius_put_int — 附加整数属性;
- radius_put_string — 附加字符串属性;
- radius_put_vendor_addr — 附加特定于供应商的 IP 地址属性;
- radius_put_vendor_attr — 附加特定于供应商的二进制属性;
- radius_put_vendor_int — 附加特定于供应商的整数属性;
- radius_put_vendor_string — 附加特定于供应商的字符串属性;
- radius_request_authenticator — 返回请求身份验证器;
- radius_salt_encrypt_attr — 对值进行盐加密;
- radius_send_request — 发送请求并等待回复;
- radius_server_secret — 返回共享密钥;
- radius_strerror — 返回错误消息。
三、使用Radius软件包
要开始使用Radius软件包进行身份认证,可以按照以下步骤操作:
1、获取RADIUS资源:首先需要获取一个RADIUS服务器的资源,可以通过购买或租用RADIUS服务器来实现。
2、配置库:在PHP中,需要安装并配置好Radius软件包的库文件。
3、创建请求:创建一个Radius请求对象,用于向RADIUS服务器发送身份验证请求。
4、put属性:将需要验证的属性(如用户名和密码)添加到请求对象中。
5、发送请求:通过Radius客户端向RADIUS服务器发送请求。
6、接收属性:从RADIUS服务器接收响应,并解析其中的验证结果。
7、关闭RADIUS资源(可选):完成身份验证后,可以选择关闭与RADIUS服务器的连接。
此外,该软件包还包含一个示例php脚本,演示了如何使用PAP或CHAP(md5)进行身份验证。如果使用Microsoft Radius服务器,则无法使用CHAP(md5)。如果要使用MS-CHAPv1或MS-CHAPv2进行身份验证,需要安装mcrypt和MHASH扩展。