使用外部表单登录 Joomla来自 angular 应用程序

问题描述

我有以下任务:一个 angular 应用程序,它有一个登录组件,我必须通过 httpClient 向另一个使用 joomla 开发的现有应用程序发送凭据数据(用户名和密码)(用户名和密码)(1.5.26) ,因此身份验证任务必须在 joomla 中完成,并将经过身份验证的用户重定向到 joomla 中的下一页,我对 joomla 非常陌生,我尝试了一些有关使用此处论坛中建议的 PHP 脚本的解决方案,但它们不起作用我或我没有做对,我真的需要你的帮助,因为我过去了 5 天没有得到结果,提前致谢。

请注意,我的 Angular 应用程序在我的本地主机上,而 joomla 应用程序托管在另一台服务器上。

这是我尝试过的:

角度:

<form #loginform="ngForm" (ngSubmit)="login(loginform)">
  <div class="formGroup">
    <mat-form-field>
      <input
        matInput
        required
        type="text"
        id="login"
        name="username"
        placeholder="username"
        ngModel
      />
    </mat-form-field>
  </div>
  <div class="formGroup">
    <mat-form-field>
      <input
        matInput
        minlength="5"
        id="password"
        required
        name="password"
        placeholder="password"
        ngModel
      />
    </mat-form-field>
  </div>
  <input
    [disabled]="!loginform.valid"
    class="submit"
    type="submit"
    value="Login"
  />
</form>
@Component({
  selector: "app-login-joomla",templateUrl: "./login-joomla.component.html",styleUrls: ["./login-joomla.component.scss"],})
export class LoginJoomlaComponent implements OnInit {
  constructor(private dataService: LoginService) {}
  ngOnInit() {}
  login(form: NgForm) {
    {
      this.dataService
        .userlogin(form.value.username,form.value.password)
        .subscribe(
          (response) => console.log("Res provider :",response),(error) => console.log("err : ",error)
        );
    }
  }
}
export class LoginService {
  redirectUrl: string;
  baseUrl: string = "https://test.com/scriptTest.PHP";
  constructor(private httpClient: HttpClient) { }
  public userlogin(username,password) {

      let headerOptions = new HttpHeaders();
      headerOptions.append('Access-Control-Allow-Origin','*');
      headerOptions.append('Content-Type','application/json');

      return this.httpClient.post<any>(this.baseUrl,{ username,password },{ headers: headerOptions })
  }

对于 Joomla scriptTest.PHP,我放在服务器的 public_html 文件夹下:

<?PHP
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Credentials: true');
header("Access-Control-Allow-Methods: PUT,GET,POST,DELETE");
header("Access-Control-Allow-Headers: Origin,X-Requested-With,Content-Type,Accept");
header("Content-Type: application/json; charset=UTF-8");

$postdata = file_get_contents("PHP://input");
$request = json_decode($postdata);

$uname = $request->username;
$upswd= $request->password;
$url = "https://test.com/test.html";

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url );
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE );
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE );
curl_setopt($ch,CURLOPT_COOKIESESSION,CURLOPT_COOKIEJAR,realpath('./cookie.txt'));
curl_setopt($ch,CURLOPT_COOKIEFILE,CURLOPT_HEADER,TRUE );
$ret = curl_exec($ch);
if (!preg_match('/name="([a-zA-z0-9]{32})"/',$ret,$spoof)) {
    preg_match("/name='([a-zA-z0-9]{32})'/",$spoof);
}

// POST fields
$postfields = array();
$postfields['username'] = $uname;
$postfields['passwd'] = $upswd;
$postfields['option'] = 'com_user';
$postfields['task'] = 'login';
$postfields[$spoof[1]] = '1';
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postfields);
$ret = curl_exec($ch);

// Get logged in cookie and pass it to the browser
preg_match('/^Set-Cookie: (.*?);/m',$m);
print_r($m);
$cookie=explode('=',$m[1]);
setcookie($cookie[0],$cookie[1]);
print_r($cookie);
print_r($postfields);


$loginRedirectUrl = 'index.PHP?option=com_content&view=article&id=14';
$loginRedirectUrl = base64_encode($loginRedirectUrl);  
$postfields['return'] = $loginRedirectUrl;

header('Location: registered page url');
?>

结果:post 请求响应返回 $postfields,但 $cookie 数组为空,并且没有发生重定向。 我真的被卡住了,我不知道该怎么办,请帮忙!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)