hemingawa 发表于 2024-11-17 20:13

Discuz扩展:OAuth Provider模块

本帖最后由 hemingawa 于 2024-11-17 21:07 编辑

这个插件用来为discuz添加oauth登录功能,允许其他应用接入你的discuz做授权登录。

安装方法:
      将其中的auth目录放在discuz根目录下就行。

API信息:
      授权端点:auth/oauth.php
      Token端点:auth/token.php
      用户信息端点:auth/whoami.php

代码:
OAuth.php 代码:
<?php
require_once '../source/class/class_core.php';
require_once '../source/function/function_home.php';

$discuz = C::app();
$discuz->init();

if($_G['uid'] == 0){
    $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
    header("Location: https://discuz.openclipsis.top/member.php?mod=logging&action=login&referer=".urlencode($url));
}

// ClientID 是 SecretID 的md5哈希值
$client_id = isset($_REQUEST["client_id"])?$_REQUEST["client_id"]:"";
$state = isset($_REQUEST["state"])?$_REQUEST["state"]:"";
$redirect = isset($_REQUEST["redirect_uri"])?$_REQUEST["redirect_uri"]:"about:blank";

// 加签
$code = $_G['uid'].".".time().".".md5($_G['uid']."@".time()."@".$client_id);

if(strstr($redirect, '?') != false){
    $authlink = $redirect."&state=".$state."&code=".$code;
}else{
    $authlink = $redirect."?state=".$state."&code=".$code;
}

?>
<!DOCTYPE html>
<html>
    <head>
      <meta charset="utf-8"/>
      <title>Authenticate</title>
    </head>
    <body>
      警告:您正在将您的论坛账号授权给第三方!<br/>
      Redirect URL:<?php echo $redirect;?><br/>
      申请的权限:
      <ul>
            <li>读取您的账户基本信息</li>
      </ul>
      如果您信任该第三方,请点击:<a href="<?php echo $authlink;?>"><button>授权</button></a>
    </body>
</html>

Token.php 代码:
<?php
if (!isset($_REQUEST["grant_type"])){
    die("method err");
}
// Auth
if ($_REQUEST["grant_type"] == "authorization_code"){
    if(!isset($_REQUEST["code"]) || !isset($_REQUEST["client_secret"])){
      die("method err");
    }
    $client_id = md5($_REQUEST["client_secret"]);
    $splitter = explode(".",$_REQUEST["code"]);
    if(count($splitter) != 3){
      die("code err");
    }
    $uid = (int)($splitter);
    $time = (int)($splitter);
    $sign = md5($uid."@".$time."@".$client_id);
    if($sign != $splitter){
      die("sig err");
    }
    if(time() - $time > 86400){
      die("time expire");
    }
    $token = ($uid * 2 + 441)."-".time()."-".md5($uid."-".time()."sig");
    die(json_encode(array(
      "access_token"=>$token
    )));
}
?>

Whoami.php 代码:
<?php
require_once '../config/config_ucenter.php';
require_once '../uc_client/client.php';

if(!isset($_REQUEST["access_token"])){
    die("method err");
}

$waa = explode("-",$_REQUEST["access_token"]);
if(count($waa) != 3){
    die("code err");
}
$at = $waa;
$uid = ((int)($at) - 441) / 2;

if(md5($uid."-".$waa."sig") != $waa){
    die("sign err");
}
$time = $waa;
if(time() - $time > 86400){
    die("login expired");
}

if($data = uc_get_user($uid,1)) {
      list($uid, $username, $email) = $data;
} else {
      die("not this user");
}

die(json_encode(array(
    "id"=>(int)($uid),
    "name"=>"w".substr(md5($uid."ppte2"),4,11),
    "nickname"=>$username,
    "avatar_url"=>UC_API."/avatar.php?uid=".$uid,
    "url"=>"https://discuz.openclipsis.top/space-uid-".$uid.".html",
    "html_url"=>"https://discuz.openclipsis.top/space-uid-".$uid.".html",
    "email"=>$email
)));
?>

使用方法:
      1,Client Key创建:
                Client Secret可以自行任取,Client ID是Client Secret的MD5哈希值。
      2,接入授权:
                通过OAuth 2.0协议接入授权即可。

PaulYangss 发表于 2024-11-21 15:42

我试一试吧

苏紫方璇 发表于 2024-11-17 20:47

请在帖子中粘贴部分核心代码
一、本版块仅限分享编程技术和源码相关内容,发布帖子必须带上关键代码和具体功能介绍【20220924强制执行】

xueyan888 发表于 2024-11-17 21:44

感谢分享

hemingawa 发表于 2024-11-17 20:59

苏紫方璇 发表于 2024-11-17 20:47
请在帖子中粘贴部分核心代码
一、本版块仅限分享编程技术和源码相关内容,发布帖子必须带上关键代码和具体 ...

已经把所有代码全粘贴到帖子里了awa
反正也没几行代码
页: [1]
查看完整版本: Discuz扩展:OAuth Provider模块