我使用Nest Apis工作的iOS应用程序,我可以通过 <?php
require_once $_SERVER['DOCUMENT_ROOT'].'/tutorial/core/init.php';
if(!is_logged_in()){
login_error_redirect();
}
include 'includes/head.php';
include 'includes/navigation.php';
if (isset($_GET['add'])) {
$brandQuery = $db->query("SELECT * FROM brand ORDER BY brand");
$parentQuery = $db->query("SELECT * FROM categories WHERE parent = 0 ORDER BY category");
if ($_POST) {
$title = sanitize($_POST['title']);
$brand = sanitize($_POST['brand']);
$categories = sanitize($_POST['child']);
$price = sanitize($_POST['price']);
$list_price = sanitize($_POST['list_price']);
$sizes = sanitize($_POST['sizes']);
$description = sanitize($_POST['description']);
$dbpath = '';
$errors= array();
if(!empty($_POST['sizes'])) {
$sizeString = sanitize($_POST['sizes']);
$sizeString = rtrim($sizeString,',');
$sizesArray = explode(',',$sizeString);
$sArray = array();
$qArray = array();
foreach($sizesArray as $ss){
$s = explode(':', $ss);
$sArray[] = $s[0];
$qArray[] = $s[1];
}
}else{$sizesArray = array();}
$required = array('title','brand','price','parent','child','sizes');
foreach($required as $field){
if($_POST[$field] == ''){
$errors[] = 'All Field With and Astrisk are required.';
break;
}
}
if (!empty($_FILES)) {
var_dump($_FILES);
$photo = $_FILES['photo'];
$name = $photo['name'];
$nameArray = explode('.',$name);
$fileName = $nameArray[0];
$fileExt = $nameArray[1];
$mime = explode('/',$photo['type']);
$mimeType = $mime[0];
$mimeExt = $mime['1'];
$tmpLoc = $photo['tmp_name'];
$fileSize = $photo['size'];
$allowed = array('png','jpg','jpeg','gif');
$uploadName = md5(microtime()).'.'.$fileExt;
$uploadPath = BASEURL.'images/proimg/'.$uploadName;
$dbpath = '/tutorial/images/proimg/'.$uploadName;
if ($mimeType != 'image') {
$errors[] = 'The file must be an image.';
}
if (!in_array($fileExt, $allowed)) {
$errors[] = 'The file extension must be a png, jpg, or gif';
}
if ($fileSize > 15000000) {
$errors[] = 'The file size must be under 15MB.';
}
if($fileExt != $mimeExt && ($mimeExt == 'jpeg' && $fileExt != 'jpg')){
$errors[] = 'File extension does not match the file.';
}
}
if(!empty($errors)){
echo display_errors($errors);
}else{
//upload file and insert into database
move_uploaded_file($tmpLoc,$uploadPath);
$insertSql = "INSERT INTO products ('title','price','list_price','brand','categories','image','sizes','description') VALUES
('$title','$price','$list_price','$brand','$categories','$sizes','$dbpath','$description')";
$db->query($insertSql);
header('Location: products.php');
}
}
?>
<h2 class="text-center">Add A New Product</h2><hr>
<form action="products.php?add=1" method="POST" enctype="multipart/form-data">
<div class="form-group col-md-3">
<label for="title">Title*:</label>
<input type="text" name="title" class="form-control" id="title" value="<?=((isset($_POST['title']))?sanitize($_POST['title']):''); ?>">
</div>
<div class="form-group col-md-3">
<label for="brand">Brand*:</label>
<select class="form-control" id="brand" name="brand">
<option value=""<?= ((isset($_POST['brand']) && $_POST['brand'] == '')?' selected':''); ?>></option>
<?php while($brand = mysqli_fetch_assoc($brandQuery)): ?>
<option value="<?=$brand['id'];?>"<?=((isset($_POST['brand']) && $_POST['brand'] == $brand['id'])?' selected':''); ?>><?=$brand['brand'];?></option>
<?php endwhile; ?>
</select>
</div>
<div class="form-group col-md-3">
<label for="parent">Parent Category*:</label>
<select class="form-control" id="parent" name="parent">
<option value=""<?=((isset($_POST['parent']) && $_POST['parent'] == '')?' selected':''); ?>></option>
<?php while($parent = mysqli_fetch_assoc($parentQuery)): ?>
<option value="<?=$parent['id'];?>"<?= ((isset($_POST['parent']) && $_POST['parent'] == $parent['id'])?' select':'') ?>><?=$parent['category'];?></option>
<?php endwhile; ?>
</select>
</div>
<div class="form-group col-md-3">
<label for="child">Child Category*:</label>
<select id="child" name="child" class="form-control">
</select>
</div>
<div class="form-group col-md-3">
<label for="price">Price*:</label>
<input type="text" id="price" name="price" class="form-control" value="<?=((isset($_POST['price']))?sanitize($_POST['price']):'');?>">
</div>
<div class="form-group col-md-3">
<label for="price">list-Price*:</label>
<input type="text" id="list_price" name="list_price" class="form-control" value="<?=((isset($_POST['list_price']))?sanitize($_POST['list_price']):'');?>">
</div>
<div class="from-group col-md-3">
<label>Quantity & more</label>
<button class="btn btn-default form-control" onclick="jQuery('#sizesModal').modal('toggle');return false;">Quantity</button>
</div>
<div class="from-group col-md-3">
<label>Quantity Preview</label>
<input type="text" class="form-control" name="sizes" id="sizes" value="<?=((isset($_POST['sizes']))?$_POST['sizes']:'');?>" readonly>
</div>
<div class="form-group col-md-6">
<label for="photo">Product Photo:</label>
<input type="file" name="photo" id="photo" class="form-control">
</div>
<div class="form-group col-md-6">
<label for="description">Description:</label>
<textarea id="description" name="description" class="form-control" rows="6"><?= ((isset($_POST['description']))?sanitize($_POST['description']):'');?></textarea>
</div>
<div class="form-group">
<input type="submit" value="Add Product" class="form-control btn btn-success">
</div><div class="clearfix"></div>
</form>
<!-- Modal -->
<div class="modal fade" id="sizesModal" tabindex="-1" role="dialog" aria-labelledby="sizesModalLabel">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="sizesModalLabel">Quantity & about</h4>
</div>
<div class="modal-body">
<div class="container-fluid">
<?php for ($i=1; $i <= 1;$i++): ?>
<div class="form-group col-md-4">
<label for="size<?=$i; ?>">More info:</label>
<input type="text" name="size <?=$i; ?>" id="size<?=$i; ?>" value="<?=((!empty($sArray[$i-1]))?$sArray[$i-1]:''); ?>" class="form-control">
</div>
<div class="form-group col-md-2">
<label for="qty<?=$i; ?>">Quantity:</label>
<input type="number" name="qty<?=$i; ?>" id="qty<?=$i; ?>" value="<?=((!empty($qArray[$i-1]))?$qArray[$i-1]:''); ?>" min="0" class="form-control">
</div>
<?php endfor; ?>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" onclick="updateSizes();jQuery('#sizesModal').modal('toggle');return false;">Save changes</button>
</div>
</div>
</div>
</div>
<?php } else {
$sql = "SELECT * FROM products WHERE deleted = 0";
$presults = $db->query($sql);
if (isset($_GET['featured'])) {
$id = (int)$_GET['id'];
$featured = (int)$_GET['featured'];
$featuredSql = "UPDATE products SET featured = '$featured' WHERE id = '$id'";
$db->query($featuredSql);
header('Location: products.php');
}
?>
<h2 class="text-center">Upload Products</h2>
<a href="products.php?add=1" class="btn btn-success pull-right" id="add-product-btn" style="margin-right: 100px;">Add Product</a><div class="clearfix"></div>
<hr>
<table class="table table-bordered table-condensed table-striped">
<thread>
<th></th> <th>Product</th> <th>Price</th> <th>Category</th> <th>Feature</th> <th>Sold</th>
</thread>
<tbody>
<?php while($product = mysqli_fetch_assoc($presults)):
$childID = $product['categories'];
$catSql = "SELECT * FROM categories WHERE id = '$childID'";
$result = $db->query($catSql);
$child = mysqli_fetch_assoc($result);
$parentID = $child['parent'];
$pSql = "SELECT * FROM categories WHERE id = '$parentID'";
$presult = $db->query($pSql);
$parent = mysqli_fetch_assoc($presult);
$category = $parent['category']. '~'.$child['category'];
?>
<tr>
<td>
<a href="products.php?edit=<?=$product['id'];?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span></a>
<a href="products.php?delete=<?=$product['id'];?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-remove"></span></a>
</td>
<td><?=$product['title']; ?></td>
<td><?=money($product['price']); ?></td>
<td><?= $category; ?></td>
<td><a href="products.php?featured=<?=(($product['featured'] == 0)?'1':'0');?>&id=<?=$product['id']; ?>" class="btn btn-xs btn-default">
<span class="glyphicon glyphicon-<?=(($product['featured']==1)?'minus':'plus');?>"></span>
</a>  <?=(($product['featured'] == 1)?'Featured Product':'');?></td>
<td>0</td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
<?php } include 'includes/footer.php'; ?>
login
logout
NestWebview
logout
。{/ p>
但问题出现在我login
并再次尝试NestWebview
,Accept page
直接显示login page
而不是login page
。所以我的要求是当用户成功注销时,它应该显示curl -v -X DELETE
"https://api.home.nest.com/oauth2/access_tokens/<access_token>"
而不是Accept Page。
对于注销,我使用Nest文档建议的下面一行代码。 https://developer.nest.com/documentation/cloud/deauthorization-overview/:
Click on Nest login
第一次如何登录。
Open login page
- &gt; After successfully,Accept login page
- &gt; Click on Accept button
- &gt; Get device list
- &gt; Click on Nest login
退出后的工作方式。
Accept login page
- &gt; Click on Accept button
- &gt; Get device list
- &gt; executeQuery()
所以注销成功后,
缺少登录页面。
他们以任何方式实现这一目标吗?提前致谢。
答案 0 :(得分:2)
几个月前我遇到过类似的问题。我查询了他们,几天后我收到了Nest的回复。
“我相信你想知道为什么你得到了权限页面 撤销令牌后,“接受”按钮而不是登录页面。原因 是因为你仍然有一个有效的网络会话,因此单点登录 尝试授权使用现有会话。如果您滚动到权限页面的底部,则会找到“登录其他帐户&gt;”链接此链接将清除现有会话并强制用户登录屏幕。“
希望它能帮助您理解您的问题。
答案 1 :(得分:1)
清除cookie将帮助您恢复登录页面,在登录时执行此操作。
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [storage cookies]) {
[storage deleteCookie:cookie];
}
[[NSUserDefaults standardUserDefaults] synchronize];